nextjlc/
lib.rs

1/* src/lib.rs */
2
3#[cfg(target_arch = "wasm32")]
4use wasm_bindgen::prelude::*;
5
6pub mod dcode;
7pub mod file_type;
8pub mod fingerprint;
9pub mod header;
10pub mod outline;
11pub mod rename;
12pub mod validation;
13
14#[cfg(target_arch = "wasm32")]
15#[wasm_bindgen]
16pub fn process_d_codes(gerber_data: String, use_altium: bool) -> String {
17    use dcode::GerberFlavor;
18
19    let flavor = if use_altium {
20        GerberFlavor::Altium
21    } else {
22        GerberFlavor::KiCad
23    };
24
25    dcode::process_d_codes(gerber_data, flavor)
26}
27
28#[cfg(target_arch = "wasm32")]
29#[wasm_bindgen]
30pub fn identify_software(content: &str) -> Option<String> {
31    file_type::identify_software(content).map(|s| s.to_string())
32}
33
34#[cfg(target_arch = "wasm32")]
35#[wasm_bindgen]
36pub fn add_fingerprint(gerber_content: &str, is_foreign_board_file: bool) -> String {
37    fingerprint::add_fingerprint(gerber_content, is_foreign_board_file)
38}
39
40#[cfg(target_arch = "wasm32")]
41#[wasm_bindgen]
42pub fn get_gerber_header() -> String {
43    header::get_gerber_header()
44}
45
46#[cfg(target_arch = "wasm32")]
47#[wasm_bindgen]
48pub fn get_order_guide_text() -> String {
49    header::get_order_guide_text().to_string()
50}
51
52#[cfg(target_arch = "wasm32")]
53#[wasm_bindgen]
54pub fn sort_gerber_files(files: Vec<String>) -> Vec<String> {
55    let mut mutable_files = files;
56    outline::sort_gerber_files(&mut mutable_files)
57}
58
59#[cfg(target_arch = "wasm32")]
60#[wasm_bindgen]
61pub fn map_filenames_ad(files: Vec<String>) -> js_sys::Map {
62    let rename_map = rename::map_filenames(&files, rename::EdaType::Ad);
63    let js_map = js_sys::Map::new();
64    for (original, renamed) in rename_map {
65        js_map.set(&JsValue::from(original), &JsValue::from(renamed));
66    }
67    js_map
68}
69
70#[cfg(target_arch = "wasm32")]
71#[wasm_bindgen]
72pub fn map_filenames_kicad(files: Vec<String>) -> js_sys::Map {
73    let rename_map = rename::map_filenames(&files, rename::EdaType::KiCad);
74    let js_map = js_sys::Map::new();
75    for (original, renamed) in rename_map {
76        js_map.set(&JsValue::from(original), &JsValue::from(renamed));
77    }
78    js_map
79}
80
81#[cfg(target_arch = "wasm32")]
82#[wasm_bindgen]
83pub struct ValidationResult {
84    pub is_valid: bool,
85    pub layer_count: u32,
86    warnings: Vec<String>,
87    errors: Vec<String>,
88}
89
90#[cfg(target_arch = "wasm32")]
91#[wasm_bindgen]
92impl ValidationResult {
93    #[wasm_bindgen(getter)]
94    pub fn warnings(&self) -> Vec<String> {
95        self.warnings.clone()
96    }
97    #[wasm_bindgen(getter)]
98    pub fn errors(&self) -> Vec<String> {
99        self.errors.clone()
100    }
101}
102
103#[cfg(target_arch = "wasm32")]
104#[wasm_bindgen]
105pub fn validate_gerber_files(files: Vec<String>) -> ValidationResult {
106    match validation::validate_gerber_files(&files) {
107        Ok(report) => ValidationResult {
108            is_valid: true,
109            layer_count: report.layer_count,
110            warnings: report.warnings,
111            errors: Vec::new(),
112        },
113        Err(errors) => ValidationResult {
114            is_valid: false,
115            layer_count: 0,
116            warnings: Vec::new(),
117            errors,
118        },
119    }
120}