diff --git a/src/specctra/design.rs b/src/specctra/design.rs index 7585830..a5e6b0b 100644 --- a/src/specctra/design.rs +++ b/src/specctra/design.rs @@ -55,8 +55,7 @@ impl SpecctraDesign { /// pub fn load(reader: impl std::io::BufRead) -> Result { let mut list_reader = ListTokenizer::new(reader); - let mut dsn = list_reader.read_value::()?; - dsn.pcb.structure.layers.append(&mut dsn.pcb.structure.layers_easyeda); // temporary hack + let dsn = list_reader.read_value::()?; Ok(Self { pcb: dsn.pcb }) } diff --git a/src/specctra/structure.rs b/src/specctra/structure.rs index c3acd62..11674fd 100644 --- a/src/specctra/structure.rs +++ b/src/specctra/structure.rs @@ -80,7 +80,7 @@ pub struct Resolution { pub value: f32, } -#[derive(ReadDsn, WriteSes, Debug)] +#[derive(WriteSes, Debug)] pub struct Structure { #[vec("layer")] pub layers: Vec, @@ -95,10 +95,26 @@ pub struct Structure { // (in class rules it outputs a single rule with all clearances like KiCad) #[vec("rule")] pub rules: Vec, - // EasyEDA outputs these last... - // this is a horrible hack to see what else causes trouble - #[vec("layer")] - pub layers_easyeda: Vec, +} + +// custom impl to handle layers appearing late +impl ReadDsn for Structure { + fn read_dsn( + tokenizer: &mut ListTokenizer, + ) -> Result { + let mut value = Self { + layers: tokenizer.read_named_array("layer")?, + boundary: tokenizer.read_named("boundary")?, + planes: tokenizer.read_named_array("plane")?, + via: tokenizer.read_named("via")?, + grids: tokenizer.read_named_array("grid")?, + rules: tokenizer.read_named_array("rule")?, + }; + + value.layers.append(&mut tokenizer.read_named_array("layer")?); + + Ok(value) + } } #[derive(ReadDsn, WriteSes, Debug)]