gerber_types/
codegen.rs

1//! Generic code generation, e.g. implementations of `PartialGerberCode` for
2//! bool or Vec<G: GerberCode>.
3
4use std::io::Write;
5
6use crate::errors::GerberResult;
7use crate::traits::{GerberCode, PartialGerberCode};
8use crate::types::*;
9
10/// Implement `PartialGerberCode` for booleans
11impl<W: Write> PartialGerberCode<W> for bool {
12    fn serialize_partial(&self, writer: &mut W) -> GerberResult<()> {
13        if *self {
14            write!(writer, "1")?;
15        } else {
16            write!(writer, "0")?;
17        };
18        Ok(())
19    }
20}
21
22/// Implement `GerberCode` for Vectors of types that are `GerberCode`.
23impl<W: Write, G: GerberCode<W>> GerberCode<W> for Vec<G> {
24    fn serialize(&self, writer: &mut W) -> GerberResult<()> {
25        for item in self.iter() {
26            item.serialize(writer)?;
27        }
28        Ok(())
29    }
30}
31
32/// Implement `PartialGerberCode` for `Option<T: PartialGerberCode>`
33impl<T: PartialGerberCode<W>, W: Write> PartialGerberCode<W> for Option<T> {
34    fn serialize_partial(&self, writer: &mut W) -> GerberResult<()> {
35        if let Some(ref val) = *self {
36            val.serialize_partial(writer)?;
37        }
38        Ok(())
39    }
40}
41
42impl<W: Write> GerberCode<W> for Command {
43    fn serialize(&self, writer: &mut W) -> GerberResult<()> {
44        match *self {
45            Command::FunctionCode(ref code) => code.serialize(writer)?,
46            Command::ExtendedCode(ref code) => code.serialize(writer)?,
47        };
48        Ok(())
49    }
50}
51
52impl<W: Write> GerberCode<W> for FunctionCode {
53    fn serialize(&self, writer: &mut W) -> GerberResult<()> {
54        match *self {
55            FunctionCode::DCode(ref code) => code.serialize(writer)?,
56            FunctionCode::GCode(ref code) => code.serialize(writer)?,
57            FunctionCode::MCode(ref code) => code.serialize(writer)?,
58        };
59        Ok(())
60    }
61}
62
63impl<W: Write> GerberCode<W> for ExtendedCode {
64    fn serialize(&self, writer: &mut W) -> GerberResult<()> {
65        match *self {
66            ExtendedCode::CoordinateFormat(ref cf) => {
67                writeln!(writer, "%FSLAX{0}{1}Y{0}{1}*%", cf.integer, cf.decimal)?;
68            }
69            ExtendedCode::Unit(ref unit) => {
70                write!(writer, "%MO")?;
71                unit.serialize_partial(writer)?;
72                writeln!(writer, "*%")?;
73            }
74            ExtendedCode::ApertureDefinition(ref def) => {
75                write!(writer, "%ADD")?;
76                def.serialize_partial(writer)?;
77                writeln!(writer, "*%")?;
78            }
79            ExtendedCode::ApertureMacro(ref am) => {
80                write!(writer, "%")?;
81                am.serialize_partial(writer)?;
82                writeln!(writer, "%")?;
83            }
84            ExtendedCode::LoadPolarity(ref polarity) => {
85                write!(writer, "%LP")?;
86                polarity.serialize_partial(writer)?;
87                writeln!(writer, "*%")?;
88            }
89            ExtendedCode::StepAndRepeat(ref sar) => {
90                write!(writer, "%SR")?;
91                sar.serialize_partial(writer)?;
92                writeln!(writer, "*%")?;
93            }
94            ExtendedCode::FileAttribute(ref attr) => {
95                write!(writer, "%TF.")?;
96                attr.serialize_partial(writer)?;
97                writeln!(writer, "*%")?;
98            }
99            ExtendedCode::DeleteAttribute(ref attr) => {
100                writeln!(writer, "%TD{}*%", attr)?;
101            }
102            _ => unimplemented!(),
103        };
104        Ok(())
105    }
106}