trey 0.2.0

Writing V3000 CTfiles.
Documentation
use std::fmt;

use super::wrap;

pub fn block<T: fmt::Display>(name: &str, items: &Vec<T>) -> Vec<String> {
    let mut result = Vec::new();

    if items.is_empty() {
        return result;
    }

    result.push(format!("M  V30 BEGIN {}", name));

    for item in items {
        let line = format!("M  V30 {}", item);

        match wrap(&line) {
            Some(mut lines) => result.append(&mut lines),
            None => result.push(line),
        }
    }

    result.push(format!("M  V30 END {}", name));

    result
}

#[cfg(test)]
mod tests {
    use super::*;
    use pretty_assertions::assert_eq;

    #[test]
    fn empty() {
        let items: Vec<String> = vec![];

        assert_eq!(block("STRING", &items), vec![String::new(); 0])
    }

    #[test]
    fn full() {
        let items = vec!["ONE".to_string(), "TWO".to_string()];

        assert_eq!(
            block("STRING", &items),
            vec![
                "M  V30 BEGIN STRING",
                "M  V30 ONE",
                "M  V30 TWO",
                "M  V30 END STRING"
            ]
        )
    }

    #[test]
    fn wrap() {
        let items = vec!["X".repeat(80)];

        assert_eq!(
            block("LONG", &items),
            vec![
                "M  V30 BEGIN LONG",
                &format!("M  V30 {}-", "X".repeat(72)),
                &format!("M  V30 {}", "X".repeat(8)),
                "M  V30 END LONG"
            ]
        )
    }
}