1use std::io::Write;
5
6use crate::errors::GerberResult;
7use crate::traits::{GerberCode, PartialGerberCode};
8use crate::types::*;
9
10impl<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
22impl<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
32impl<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}