Пример #1
0
        public override bool Equals(object obj)
        {
            if (!(obj is JsonNode))
            {
                return(false);
            }

            var rhs = (JsonNode)obj;

            if ((Value.ValueType == JsonValueType.Integer || Value.ValueType == JsonValueType.Null) &&
                (rhs.Value.ValueType == JsonValueType.Integer || rhs.Value.ValueType == JsonValueType.Number))
            {
                // ok
            }
            else if (Value.ValueType != rhs.Value.ValueType)
            {
                return(false);
            }

            switch (Value.ValueType)
            {
            case JsonValueType.Null:
                return(true);

            case JsonValueType.Boolean:
                return(Value.GetBoolean() == rhs.GetBoolean());

            case JsonValueType.Integer:
            case JsonValueType.Number:
                return(Value.GetDouble() == rhs.GetDouble());

            case JsonValueType.String:
                return(Value.GetString() == rhs.GetString());

            case JsonValueType.Array:
                return(ArrayItems.SequenceEqual(rhs.ArrayItems));

            case JsonValueType.Object:
            {
                var l = ObjectItems.ToDictionary(x => x.Key, x => x.Value);
                var r = rhs.ObjectItems.ToDictionary(x => x.Key, x => x.Value);
                l.Equals(r);
                return(ObjectItems.OrderBy(x => x.Key).SequenceEqual(rhs.ObjectItems.OrderBy(x => x.Key)));
            }
            }

            return(false);
        }
Пример #2
0
        public InsertObjectMenuItem()
        {
            DataContext = this;

            ObjectItems = Inst.TypeDictionary.Values.Where(t =>
                                                           !t.IsAbstract && t.IsPublic && t.GetCustomAttribute <UncreatableAttribute>() == null &&
                                                           !typeof(Service).IsAssignableFrom(t.Type)).Select(t => new ObjectItem(t.Type));

            InitializeComponent();

            ObjectItems.ForEach(x => Items.Add(new MenuItem()
            {
                Header = x.Name,
                Icon   = new Image {
                    Source = new BitmapImage(x.Icon)
                },
            }));
        }
Пример #3
0
 public bool ContainsKey(string key)
 {
     return(ObjectItems.Any(x => x.Key == key));
 }
Пример #4
0
        public IEnumerable <JsonDiff> Diff(JsonNode rhs, JsonPointer path = default(JsonPointer))
        {
            switch (Value.ValueType)
            {
            case JsonValueType.Null:
            case JsonValueType.Boolean:
            case JsonValueType.Number:
            case JsonValueType.Integer:
            case JsonValueType.String:
                if (!Equals(rhs))
                {
                    yield return(new JsonDiff(this, JsonDiffType.ValueChanged, string.Format("{0} => {1}", Value, rhs.Value)));
                }
                yield break;
            }

            if (Value.ValueType != rhs.Value.ValueType)
            {
                yield return(new JsonDiff(this, JsonDiffType.ValueChanged, string.Format("{0} => {1}", Value.ValueType, rhs.Value)));

                yield break;
            }

            if (Value.ValueType == JsonValueType.Object)
            {
                var l = ObjectItems.ToDictionary(x => x.Key, x => x.Value);
                var r = rhs.ObjectItems.ToDictionary(x => x.Key, x => x.Value);

                foreach (var kv in l)
                {
                    JsonNode x;
                    if (r.TryGetValue(kv.Key, out x))
                    {
                        r.Remove(kv.Key);
                        // Found
                        foreach (var y in kv.Value.Diff(x))
                        {
                            yield return(y);
                        }
                    }
                    else
                    {
                        // Removed
                        yield return(new JsonDiff(kv.Value, JsonDiffType.KeyRemoved, kv.Value.Value.ToString()));
                    }
                }

                foreach (var kv in r)
                {
                    // Addded
                    yield return(new JsonDiff(kv.Value, JsonDiffType.KeyAdded, kv.Value.Value.ToString()));
                }
            }
            else if (Value.ValueType == JsonValueType.Array)
            {
                var ll = ArrayItems.GetEnumerator();
                var rr = rhs.ArrayItems.GetEnumerator();
                while (true)
                {
                    var lll = ll.MoveNext();
                    var rrr = rr.MoveNext();
                    if (lll && rrr)
                    {
                        // found
                        foreach (var y in ll.Current.Diff(rr.Current))
                        {
                            yield return(y);
                        }
                    }
                    else if (lll)
                    {
                        yield return(new JsonDiff(ll.Current, JsonDiffType.KeyRemoved, ll.Current.Value.ToString()));
                    }
                    else if (rrr)
                    {
                        yield return(new JsonDiff(rr.Current, JsonDiffType.KeyAdded, rr.Current.Value.ToString()));
                    }
                    else
                    {
                        // end
                        break;
                    }
                }
            }
            else
            {
                throw new NotImplementedException();
            }
        }