Browse Source

Named ID

pull/1/head
Sebastian 9 years ago
parent
commit
c0fb09be13
  1. 53
      src/Squidex.Infrastructure/Json/NamedGuidIdConverted.cs
  2. 46
      src/Squidex.Infrastructure/Json/NamedStringIdConverted.cs
  3. 49
      src/Squidex.Infrastructure/NamedId.cs

53
src/Squidex.Infrastructure/Json/NamedGuidIdConverted.cs

@ -0,0 +1,53 @@
// ==========================================================================
// NamedGuidIdConverted.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Linq;
using Newtonsoft.Json;
namespace Squidex.Infrastructure.Json
{
public sealed class NamedGuidIdConverted : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var namedId = (NamedId<Guid>)value;
writer.WriteValue($"{namedId.Id},{namedId.Name}");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var parts = ((string)reader.Value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2)
{
throw new JsonException("Named id must have more than 2 parts divided by commata");
}
Guid id;
if (!Guid.TryParse(parts[0], out id))
{
throw new JsonException("Named id must be a valid guid");
}
return new NamedId<Guid>(id, string.Join(",", parts.Skip(1)));
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(NamedId<Guid>);
}
}
}

46
src/Squidex.Infrastructure/Json/NamedStringIdConverted.cs

@ -0,0 +1,46 @@
// ==========================================================================
// NamedStringIdConverted.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Linq;
using Newtonsoft.Json;
namespace Squidex.Infrastructure.Json
{
public sealed class NamedStringIdConverted : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var namedId = (NamedId<string>)value;
writer.WriteValue($"{namedId.Id},{namedId.Name}");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return null;
}
var parts = ((string)reader.Value).Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2)
{
throw new JsonException("Named id must have more than 2 parts divided by colon");
}
return new NamedId<string>(parts[0], string.Join(",", parts.Skip(1)));
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(NamedId<string>);
}
}
}

49
src/Squidex.Infrastructure/NamedId.cs

@ -0,0 +1,49 @@
// ==========================================================================
// NamedId.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
namespace Squidex.Infrastructure
{
public sealed class NamedId<T> : IEquatable<NamedId<T>>
{
public T Id { get; }
public string Name { get; }
public NamedId(T id, string name)
{
Guard.NotNull(id, nameof(id));
Guard.NotNull(name, nameof(name));
Id = id;
Name = name;
}
public override string ToString()
{
return $"{Id},{Name}";
}
public override bool Equals(object obj)
{
return Equals(obj as NamedId<T>);
}
public bool Equals(NamedId<T> other)
{
return other != null && (ReferenceEquals(this, other) || Id.Equals(other.Id)));
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
}
Loading…
Cancel
Save