Skip to main content

rust_usage/
rust_usage.rs

1//! One-shot Thai smart card read example.
2//!
3//! This example links to the library at compile time (not dynamic loading).
4//! It works on macOS, Linux, and Windows via:
5//!     cargo run --example rust_usage [reader_name]
6//!
7//! For the C FFI / shared-library approach, see the c_usage.c, go_usage.go,
8//! python_usage.py, and ruby_usage.rb examples.
9
10use std::env;
11use thaiidcard::{model, Options, SmartCard};
12
13fn main() {
14    let reader_name = env::args().nth(1);
15
16    match SmartCard::list_readers() {
17        Ok(readers) => {
18            println!("Found {} reader(s):", readers.len());
19            for (i, r) in readers.iter().enumerate() {
20                println!("  [{}] {}", i, r);
21            }
22        }
23        Err(e) => eprintln!("Failed to list readers: {}", e),
24    }
25
26    let opts = Options {
27        show_nhso_data: true,
28        ..Options::default()
29    };
30
31    let card = SmartCard::new();
32    println!("\nWaiting for card...");
33    match card.read(reader_name.as_deref(), &opts) {
34        Ok(data) => {
35            print_card_data(&data);
36        }
37        Err(e) => eprintln!("Read error: {}", e),
38    }
39}
40
41fn print_card_data(data: &model::CardData) {
42    if let Some(p) = &data.personal {
43        println!("\n=== Personal Information ===");
44        println!("  CID:               {}", p.cid);
45        println!("  Name (TH):         {}", p.name.full_name);
46        println!("  Name (EN):         {}", p.name_en.full_name);
47        println!("  DOB:               {}", p.dob);
48        println!("  Gender:            {}", p.gender);
49        println!("  Card Issuer:       {}", p.card_issuer);
50        println!("  Issue Date:        {}", p.issue_date);
51        println!("  Expire Date:       {}", p.expire_date);
52        println!("  Address:           {}", p.address.full_address);
53        if !p.face_image.is_empty() {
54            println!("  Face Image:        [{} bytes base64]", p.face_image.len());
55        }
56    }
57
58    if let Some(c) = &data.card {
59        if !c.laser_id.is_empty() {
60            println!("\n=== Card Info ===");
61            println!("  Laser ID:          {}", c.laser_id);
62        }
63    }
64
65    if let Some(n) = &data.nhso {
66        if !n.main_inscl.is_empty() {
67            println!("\n=== NHSO Information ===");
68            println!("  Main Inscl:        {}", n.main_inscl);
69            println!("  Sub Inscl:         {}", n.sub_inscl);
70            println!("  Main Hosp:         {}", n.main_hospital);
71            println!("  Sub Hosp:          {}", n.sub_hospital);
72            println!("  Paid Type:         {}", n.paid_type);
73            println!("  NHSO Issue:        {}", n.issue_date);
74            println!("  NHSO Expire:       {}", n.expire_date);
75            println!("  NHSO Update:       {}", n.update_date);
76            println!("  Change Hosp:       {}", n.change_hospital_amount);
77        }
78    }
79}