sgf_parse/
serialize.rs

1use crate::GameTree;
2
3/// Returns the serialized SGF text from a collection of [`GameTree`] objects.
4///
5/// For serializing a single node, check out the
6/// [`SgfNode::serialize`](`crate::SgfNode::serialize`) method.
7///
8/// # Examples
9/// ```
10/// use sgf_parse::{serialize, SgfNode, SgfProp};
11/// use sgf_parse::go::Prop;
12///
13/// let first_node: SgfNode::<Prop> = {
14///     let children = vec![
15///         SgfNode::new(
16///             vec![Prop::new("B".to_string(),
17///             vec!["dd".to_string()])], vec![],
18///             false,
19///         ),
20///     ];
21///     SgfNode::new(vec![Prop::SZ((19, 19))], children, true)
22/// };
23/// let second_node = SgfNode::<Prop>::new(vec![Prop::C("A comment".into())], vec![], true);
24/// let gametrees = vec![first_node.into(), second_node.into()];
25/// let serialized = serialize(&gametrees);
26///
27/// assert_eq!(serialized, "(;SZ[19:19];B[dd])(;C[A comment])");
28/// ```
29pub fn serialize<'a>(gametrees: impl IntoIterator<Item = &'a GameTree>) -> String {
30    gametrees
31        .into_iter()
32        .map(|gametree| gametree.to_string())
33        .collect::<Vec<String>>()
34        .join("")
35}
36
37#[cfg(test)]
38mod test {
39    use super::serialize;
40    use crate::parse;
41
42    #[test]
43    fn simple_sgf() {
44        let sgf = "(;C[Some comment];B[de]FOO[bar][baz];W[fe])(;B[de];W[ff])";
45        let game_trees = parse(sgf).unwrap();
46        let result = serialize(&game_trees);
47        assert_eq!(result, sgf);
48    }
49}