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}