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);
}
}