trey/write/
header.rs

1use crate::header::Header;
2
3pub fn header(header: &Header) -> Vec<String> {
4    let mut result = Vec::new();
5
6    result.push(header.name.to_string());
7    result.push(
8        format!(
9            "{}{}{}{}{}{}{}",
10            header.initials.iter().collect::<String>(),
11            header.program.iter().collect::<String>(),
12            header.timestamp,
13            header.dimensional_code,
14            header.scaling_factors.iter().collect::<String>(),
15            header.energy.iter().collect::<String>(),
16            header.registry_number.iter().collect::<String>(),
17        )
18        .trim_end()
19        .to_string(),
20    );
21    result.push(header.comments.to_string());
22    result.push("  0  0  0     0  0            999 V3000".to_string());
23
24    result
25}
26
27#[cfg(test)]
28mod tests {
29    use crate::header::{Comment, Name};
30
31    use super::*;
32    use pretty_assertions::assert_eq;
33
34    #[test]
35    fn default() {
36        let hdr = Header::default();
37
38        assert_eq!(
39            header(&hdr),
40            vec![
41                "",
42                "  MM V3K  01017000002D",
43                "",
44                "  0  0  0     0  0            999 V3000",
45            ]
46        )
47    }
48
49    #[test]
50    fn custom_name_and_comments() {
51        let hdr = Header {
52            name: Name::try_from("name").unwrap(),
53            comments: Comment::try_from("comment...").unwrap(),
54            ..Default::default()
55        };
56
57        assert_eq!(
58            header(&hdr),
59            vec![
60                "name",
61                "  MM V3K  01017000002D",
62                "comment...",
63                "  0  0  0     0  0            999 V3000",
64            ]
65        )
66    }
67}