private static void WriteValue( IObjectWriter objectWriter, TemplateToken value) { switch (value?.Type ?? TokenType.Null) { case TokenType.Null: objectWriter.WriteNull(); break; case TokenType.Boolean: var booleanToken = value as BooleanToken; objectWriter.WriteBoolean(booleanToken.Value); break; case TokenType.Number: var numberToken = value as NumberToken; objectWriter.WriteNumber(numberToken.Value); break; case TokenType.String: case TokenType.BasicExpression: case TokenType.InsertExpression: objectWriter.WriteString(value.ToString()); break; case TokenType.Mapping: var mappingToken = value as MappingToken; objectWriter.WriteMappingStart(); foreach (var pair in mappingToken) { WriteValue(objectWriter, pair.Key); WriteValue(objectWriter, pair.Value); } objectWriter.WriteMappingEnd(); break; case TokenType.Sequence: var sequenceToken = value as SequenceToken; objectWriter.WriteSequenceStart(); foreach (var item in sequenceToken) { WriteValue(objectWriter, item); } objectWriter.WriteSequenceEnd(); break; default: throw new NotSupportedException($"Unexpected type '{value.GetType()}'"); } }