jtd-codegen 0.1.4

Generate code from JSON Typedef schemas
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace {{namespace}}
{
{{ comment 80 "    /// <summary>" "    /// " "    /// </summary>" description }}
    {{#if is_abstract}}[JsonConverter(typeof({{name}}.JsonConverter))]{{/if}}
    public {{#if is_abstract}}abstract {{/if}}class {{name}} {{#if extends}}: {{extends}}{{/if}}
    {
{{#if static_property}}
        [JsonProperty({{static_property.rename}})]
        public const string {{static_property.name}} = {{static_property.value}};
{{/if}}
{{#each properties}}
{{ comment 80 "        /// <value>" "        /// " "        /// </value>" description }}
        {{#if rename}}[JsonProperty({{rename}})]{{/if}}
        public {{value}} {{name}} { get; set; }
{{/each}}

{{#if is_primitive_wrapper}}
        private class JsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanRead => true;
            public override bool CanWrite => true;

            public override bool CanConvert(System.Type objectType)
            {
                return objectType == typeof({{properties.0.value}});
            }

            public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
            {
                return new {{name}} { Value = serializer.Deserialize<{{properties.0.value}}>(reader) };
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                serializer.Serialize(writer, (({{name}}) value).Value);
            }
        }
{{/if}}

{{#if is_discriminator}}
        private class JsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanRead => true;
            public override bool CanWrite => false;

            public override bool CanConvert(System.Type objectType)
            {
                return
{{#each discriminator_variants}}
                    objectType == typeof({{class_name}}) {{#unless @last}} ||{{/unless}}
{{/each}};
            }

            public override object ReadJson(JsonReader reader, System.Type objectType, object existingValue, JsonSerializer serializer)
            {
                JObject obj = JObject.Load(reader);
                JProperty discriminator = obj.Property({{discriminator}});

                if (discriminator == null || discriminator.Value.Type != JTokenType.String)
                {
                    throw new JsonSerializationException("bad discriminator property");
                }

                string discriminatorValue = (string) discriminator.Value;
                switch (discriminatorValue)
                {
{{#each discriminator_variants}}
                    case {{json_name}}:
                    {
                        {{class_name}} value = new {{class_name}}();
                        serializer.Populate(obj.CreateReader(), value);
                        return value;
                    }
{{/each}}
                    default:
                        throw new JsonSerializationException("bad discriminator value");
                }
            }

            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
                throw new NotImplementedException();
            }
        }
{{/if}}
    }
}