hkid_ops/
lib.rs

1//! # `hkid_ops` Usage Examples
2//!
3//! This section demonstrates common usage patterns for the `hkid_ops` library, including symbol and prefix parsing, HKID generation, and validation.
4//!
5//! ---
6//!
7//! ## 1. HKID Symbol Parsing
8//!
9//! ```ignore
10//! use hkid_ops::HKIDSymbol;
11//!
12//! let symbols = [
13//!     "***", "*", "A", "B", "C", "N", "O", "R", "U", "W", "X", "Y", "Z", "H1", "L2", "Unknown"
14//! ];
15//! for (i, sym) in symbols.iter().enumerate() {
16//!     let parsed = HKIDSymbol::parse(sym);
17//!     println!("[{}] Input: {:?} => Parsed: {:?}", i + 1, sym, parsed);
18//! }
19//! ```
20//!
21//! ## 2. HKID Prefix Parsing
22//!
23//! ```ignore
24//! use hkid_ops::HKIDPrefix;
25//!
26//! let prefixes = [
27//!     "A", "C", "F", "K", "N", "R", "Z", "EC", "WX", "XA", "Unknown"
28//! ];
29//! for (i, prefix) in prefixes.iter().enumerate() {
30//!     let parsed = HKIDPrefix::parse(prefix);
31//!     println!("[{}] Input: {:?} => Parsed: {:?}", i + 1, prefix, parsed);
32//! }
33//! ```
34//!
35//! ## 3. HKID Generation and Validation (Known Prefixes)
36//!
37//! ```ignore
38//! use hkid_ops::{hkid_generator, validate_hkid};
39//!
40//! let gen_prefixes = ["A", "K", "WX", "XA"];
41//! for (i, prefix) in gen_prefixes.iter().enumerate() {
42//!     println!("\n[{}] Generating HKID with prefix '{}':", i + 1, prefix);
43//!     match hkid_generator::generate_hkid(Some(prefix), true) {
44//!         Ok(hkid) => {
45//!             println!("Generated: {}", hkid);
46//!             // Validate the generated HKID
47//!             match validate_hkid(&hkid, true) {
48//!                 Ok(valid) => println!("    Validation result: {}", if valid { "Valid" } else { "Invalid" }),
49//!                 Err(e) => println!("    Validation error: {}", e),
50//!             }
51//!         }
52//!         Err(e) => println!("Error: {}", e),
53//!     }
54//! }
55//! ```
56//!
57//! ## 4. HKID Generation Allowing Unknown Prefixes
58//!
59//! ```ignore
60//! use hkid_ops::hkid_generator;
61//!
62//! let test_prefixes = ["A", "WX", "ZZ"];
63//! for prefix in test_prefixes {
64//!     println!("\nGenerating HKID with prefix '{}', must_exist_in_enum = true:", prefix);
65//!     match hkid_generator::generate_hkid(Some(prefix), true) {
66//!         Ok(hkid) => println!("    Generated: {}", hkid),
67//!         Err(e) => println!("    Error: {}", e),
68//!     }
69//!     println!("Generating HKID with prefix '{}', must_exist_in_enum = false:", prefix);
70//!     match hkid_generator::generate_hkid(Some(prefix), false) {
71//!         Ok(hkid) => println!("    Generated (allowed unknown): {}", hkid),
72//!         Err(e) => println!("    Error: {}", e),
73//!     }
74//! }
75//! ```
76//!
77//! ## 5. HKID Generation Using a Random Prefix
78//!
79//! ```ignore
80//! use hkid_ops::{hkid_generator, validate_hkid};
81//!
82//! // Random known prefix
83//! println!("Generating HKID with random prefix (must_exist_in_enum = true):");
84//! match hkid_generator::generate_hkid(None, true) {
85//!     Ok(hkid) => {
86//!         println!("    Generated: {}", hkid);
87//!         match validate_hkid(&hkid, true) {
88//!             Ok(valid) => println!("    Validation result: {}", if valid { "Valid" } else { "Invalid" }),
89//!             Err(e) => println!("    Validation error: {}", e),
90//!         }
91//!     }
92//!     Err(e) => println!("    Error: {}", e),
93//! }
94//!
95//! // Random unknown-or-known prefix
96//! println!("Generating HKID with random prefix (must_exist_in_enum = false):");
97//! match hkid_generator::generate_hkid(None, false) {
98//!     Ok(hkid) => {
99//!         println!("    Generated: {}", hkid);
100//!         match validate_hkid(&hkid, false) {
101//!             Ok(valid) => println!("    Validation result: {}", if valid { "Valid" } else { "Invalid" }),
102//!             Err(e) => println!("    Validation error: {}", e),
103//!         }
104//!     }
105//!     Err(e) => println!("    Error: {}", e),
106//! }
107//! ```
108//!
109//! ## 6. HKID Validation (Various Samples)
110//!
111//! ```ignore
112//! use hkid_ops::validate_hkid;
113//!
114//! let samples = [
115//!     ("A123456(7)", true),    // Valid, known prefix, correct format
116//!     ("AB123456(9)", true),   // Valid, known prefix, correct format
117//!     ("ZZ123456(9)", false),  // Unknown prefix, but allowed
118//!     ("A123456(8)", true),    // Invalid check digit
119//!     ("A12345(7)", true),     // Invalid length
120//!     ("A123456(7)", false),   // Accept unknown prefix (should be fine)
121//!     ("PB100001(8)", false),  // Valid for unknown prefix
122//!     ("PB100001(8)", true),   // Unknown prefix, must_exist_in_enum
123//! ];
124//! for (i, (hkid, must_exist)) in samples.iter().enumerate() {
125//!     println!("\n[{}] Validating HKID '{}', must_exist_in_enum = {}:", i + 1, hkid, must_exist);
126//!     match validate_hkid(hkid, *must_exist) {
127//!         Ok(valid) => println!("{}", if valid { "Valid" } else { "Invalid" }),
128//!         Err(e) => println!("Error: {}", e),
129//!     }
130//! }
131//! ```
132//!
133//! ---
134//!
135//! For more advanced or interactive usage, see the `examples/` directory of the repository.
136//!
137//! > These code snippets are for demonstration purposes; some require the crate to be used as a binary for visible output via `println!`.
138//!
139
140pub mod hkid_check_digit;
141pub mod hkid_generator;
142pub mod hkid_prefix;
143pub mod hkid_symbol;
144pub mod hkid_validator;
145
146const WEIGHTS: [u32; 8] = [9, 8, 7, 6, 5, 4, 3, 2];