Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
DynamicYamlMapping.cs
Go to the documentation of this file.
1 using System;
2 using System.Dynamic;
3 using SharpYaml.Serialization;
4 
5 namespace SiliconStudio.Core.Yaml
6 {
7  /// <summary>
8  /// Dynamic version of <see cref="YamlMappingNode"/>.
9  /// </summary>
11  {
12  internal YamlMappingNode node;
13 
14  public YamlMappingNode Node
15  {
16  get
17  {
18  return node;
19  }
20  }
21 
22  public DynamicYamlMapping(YamlMappingNode node)
23  {
24  this.node = node;
25  }
26 
27  public void MoveChild(object key, int movePosition)
28  {
29  var yamlKey = ConvertFromDynamic(key);
30  var keyPosition = node.Children.IndexOf(yamlKey);
31 
32  if (keyPosition == movePosition)
33  return;
34 
35  // Remove child
36  var item = node.Children[keyPosition];
37  node.Children.RemoveAt(keyPosition);
38 
39  // Adjust insertion position (if we insert in a position after the removal position)
40  if (movePosition > keyPosition)
41  movePosition--;
42 
43  // Insert item at new position
44  node.Children.Insert(movePosition, item.Key, item.Value);
45  }
46 
47  public void RemoveChild(object key)
48  {
49  var yamlKey = ConvertFromDynamic(key);
50  var keyPosition = node.Children.IndexOf(yamlKey);
51  node.Children.RemoveAt(keyPosition);
52  }
53 
54  public int IndexOf(object key)
55  {
56  var yamlKey = ConvertFromDynamic(key);
57 
58  return node.Children.IndexOf(yamlKey);
59  }
60 
61  public override bool TryConvert(ConvertBinder binder, out object result)
62  {
63  if (binder.Type.IsAssignableFrom(node.GetType()))
64  {
65  result = node;
66  }
67  else
68  {
69  throw new InvalidOperationException();
70  }
71  return true;
72  }
73 
74  public override bool TryGetMember(GetMemberBinder binder, out object result)
75  {
76  result = GetValue(new YamlScalarNode(binder.Name));
77  return true;
78  }
79 
80  public override bool TrySetMember(SetMemberBinder binder, object value)
81  {
82  var key = new YamlScalarNode(binder.Name);
83 
84  if (value is DynamicYamlEmpty)
85  node.Children.Remove(key);
86  else
87  node.Children[key] = ConvertFromDynamic(value);
88  return true;
89  }
90 
91  public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
92  {
93  var key = ConvertFromDynamic(indexes[0]);
94  if (value is DynamicYamlEmpty)
95  node.Children.Remove(key);
96  else
97  node.Children[key] = ConvertFromDynamic(value);
98  return true;
99  }
100 
101  public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
102  {
103  var key = ConvertFromDynamic(indexes[0]);
104  result = GetValue(key);
105  return true;
106  }
107 
108  private object GetValue(YamlNode key)
109  {
110  YamlNode result;
111  if (node.Children.TryGetValue(key, out result))
112  {
113  return ConvertToDynamic(result);
114  }
115  return null;
116  }
117  }
118 }
Dynamic version of YamlMappingNode.
override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
Placeholder value to remove keys from DynamicYamlMapping.
void MoveChild(object key, int movePosition)
override bool TrySetMember(SetMemberBinder binder, object value)
override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
override bool TryConvert(ConvertBinder binder, out object result)
override bool TryGetMember(GetMemberBinder binder, out object result)