1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use crate::GameTree;

/// Returns the serialized SGF text from a collection of [`GameTree`] objects.
///
/// For serializing a single node, check out the
/// [`SgfNode::serialize`](`crate::SgfNode::serialize`) method.
///
/// # Examples
/// ```
/// use sgf_parse::{serialize, SgfNode, SgfProp};
/// use sgf_parse::go::Prop;
///
/// let first_node: SgfNode::<Prop> = {
///     let children = vec![
///         SgfNode::new(
///             vec![Prop::new("B".to_string(),
///             vec!["dd".to_string()])], vec![],
///             false,
///         ),
///     ];
///     SgfNode::new(vec![Prop::SZ((19, 19))], children, true)
/// };
/// let second_node = SgfNode::<Prop>::new(vec![Prop::C("A comment".into())], vec![], true);
/// let gametrees = vec![first_node.into(), second_node.into()];
/// let serialized = serialize(&gametrees);
///
/// assert_eq!(serialized, "(;SZ[19:19];B[dd])(;C[A comment])");
/// ```
pub fn serialize<'a>(gametrees: impl IntoIterator<Item = &'a GameTree>) -> String {
    gametrees
        .into_iter()
        .map(|gametree| gametree.to_string())
        .collect::<Vec<String>>()
        .join("")
}

#[cfg(test)]
mod test {
    use super::serialize;
    use crate::parse;

    #[test]
    fn simple_sgf() {
        let sgf = "(;C[Some comment];B[de]FOO[bar][baz];W[fe])(;B[de];W[ff])";
        let game_trees = parse(sgf).unwrap();
        let result = serialize(&game_trees);
        assert_eq!(result, sgf);
    }
}