using System; 
 | 
using System.Collections.Generic; 
 | 
using System.IO; 
 | 
using System.Text; 
 | 
using System.Linq; 
 | 
  
 | 
#if UNITY_XCODE_API_BUILD 
 | 
namespace UnityEditor.iOS.Xcode 
 | 
#else 
 | 
namespace UnityEditor.iOS.Xcode.Custom 
 | 
#endif 
 | 
{ 
 | 
    internal class JsonElement 
 | 
    { 
 | 
        protected JsonElement() {} 
 | 
  
 | 
        // convenience methods 
 | 
        public string AsString() { return ((JsonElementString)this).value; } 
 | 
        public int AsInteger()   { return ((JsonElementInteger)this).value; } 
 | 
        public bool AsBoolean()  { return ((JsonElementBoolean)this).value; } 
 | 
        public JsonElementArray AsArray() { return (JsonElementArray)this; } 
 | 
        public JsonElementDict AsDict()   { return (JsonElementDict)this; } 
 | 
  
 | 
        public JsonElement this[string key] 
 | 
        { 
 | 
            get { return AsDict()[key]; } 
 | 
            set { AsDict()[key] = value; } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    internal class JsonElementString : JsonElement 
 | 
    { 
 | 
        public JsonElementString(string v) { value = v; } 
 | 
  
 | 
        public string value; 
 | 
    } 
 | 
  
 | 
    internal class JsonElementInteger : JsonElement 
 | 
    { 
 | 
        public JsonElementInteger(int v) { value = v; } 
 | 
  
 | 
        public int value; 
 | 
    } 
 | 
  
 | 
    internal class JsonElementBoolean : JsonElement 
 | 
    { 
 | 
        public JsonElementBoolean(bool v) { value = v; } 
 | 
  
 | 
        public bool value; 
 | 
    } 
 | 
  
 | 
    internal class JsonElementDict : JsonElement 
 | 
    { 
 | 
        public JsonElementDict() : base() {} 
 | 
  
 | 
        private SortedDictionary<string, JsonElement> m_PrivateValue = new SortedDictionary<string, JsonElement>(); 
 | 
        public IDictionary<string, JsonElement> values { get { return m_PrivateValue; }} 
 | 
  
 | 
        new public JsonElement this[string key] 
 | 
        { 
 | 
            get { 
 | 
                if (values.ContainsKey(key)) 
 | 
                    return values[key]; 
 | 
                return null; 
 | 
            } 
 | 
            set { this.values[key] = value; } 
 | 
        } 
 | 
  
 | 
        public bool Contains(string key) 
 | 
        { 
 | 
            return values.ContainsKey(key); 
 | 
        } 
 | 
  
 | 
        public void Remove(string key) 
 | 
        { 
 | 
            values.Remove(key); 
 | 
        } 
 | 
  
 | 
        // convenience methods 
 | 
        public void SetInteger(string key, int val) 
 | 
        { 
 | 
            values[key] = new JsonElementInteger(val); 
 | 
        } 
 | 
  
 | 
        public void SetString(string key, string val) 
 | 
        { 
 | 
            values[key] = new JsonElementString(val); 
 | 
        } 
 | 
  
 | 
        public void SetBoolean(string key, bool val) 
 | 
        { 
 | 
            values[key] = new JsonElementBoolean(val); 
 | 
        } 
 | 
  
 | 
        public JsonElementArray CreateArray(string key) 
 | 
        { 
 | 
            var v = new JsonElementArray(); 
 | 
            values[key] = v; 
 | 
            return v; 
 | 
        } 
 | 
  
 | 
        public JsonElementDict CreateDict(string key) 
 | 
        { 
 | 
            var v = new JsonElementDict(); 
 | 
            values[key] = v; 
 | 
            return v; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    internal class JsonElementArray : JsonElement 
 | 
    { 
 | 
        public JsonElementArray() : base() {} 
 | 
        public List<JsonElement> values = new List<JsonElement>(); 
 | 
  
 | 
        // convenience methods 
 | 
        public void AddString(string val) 
 | 
        { 
 | 
            values.Add(new JsonElementString(val)); 
 | 
        } 
 | 
  
 | 
        public void AddInteger(int val) 
 | 
        { 
 | 
            values.Add(new JsonElementInteger(val)); 
 | 
        } 
 | 
  
 | 
        public void AddBoolean(bool val) 
 | 
        { 
 | 
            values.Add(new JsonElementBoolean(val)); 
 | 
        } 
 | 
  
 | 
        public JsonElementArray AddArray() 
 | 
        { 
 | 
            var v = new JsonElementArray(); 
 | 
            values.Add(v); 
 | 
            return v; 
 | 
        } 
 | 
  
 | 
        public JsonElementDict AddDict() 
 | 
        { 
 | 
            var v = new JsonElementDict(); 
 | 
            values.Add(v); 
 | 
            return v; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    internal class JsonDocument 
 | 
    { 
 | 
        public JsonElementDict root; 
 | 
        public string indentString = "  "; 
 | 
  
 | 
        public JsonDocument() 
 | 
        { 
 | 
            root = new JsonElementDict(); 
 | 
        } 
 | 
  
 | 
        void AppendIndent(StringBuilder sb, int indent) 
 | 
        { 
 | 
            for (int i = 0; i < indent; ++i) 
 | 
                sb.Append(indentString); 
 | 
        } 
 | 
  
 | 
        void WriteString(StringBuilder sb, string str) 
 | 
        { 
 | 
            // TODO: escape 
 | 
            sb.Append('"'); 
 | 
            sb.Append(str); 
 | 
            sb.Append('"'); 
 | 
        } 
 | 
  
 | 
        void WriteBoolean(StringBuilder sb, bool value) 
 | 
        { 
 | 
            sb.Append(value ? "true" : "false"); 
 | 
        } 
 | 
  
 | 
        void WriteInteger(StringBuilder sb, int value) 
 | 
        { 
 | 
            sb.Append(value.ToString()); 
 | 
        } 
 | 
  
 | 
        void WriteDictKeyValue(StringBuilder sb, string key, JsonElement value, int indent) 
 | 
        { 
 | 
            sb.Append("\n"); 
 | 
            AppendIndent(sb, indent); 
 | 
            WriteString(sb, key); 
 | 
            sb.Append(" : "); 
 | 
            if (value is JsonElementString) 
 | 
                WriteString(sb, value.AsString()); 
 | 
            else if (value is JsonElementInteger) 
 | 
                WriteInteger(sb, value.AsInteger()); 
 | 
            else if (value is JsonElementBoolean) 
 | 
                WriteBoolean(sb, value.AsBoolean()); 
 | 
            else if (value is JsonElementDict) 
 | 
                WriteDict(sb, value.AsDict(), indent); 
 | 
            else if (value is JsonElementArray) 
 | 
                WriteArray(sb, value.AsArray(), indent); 
 | 
        } 
 | 
  
 | 
        void WriteDict(StringBuilder sb, JsonElementDict el, int indent) 
 | 
        { 
 | 
            sb.Append("{"); 
 | 
            bool hasElement = false; 
 | 
            foreach (var key in el.values.Keys) 
 | 
            { 
 | 
                if (hasElement) 
 | 
                    sb.Append(","); // trailing commas not supported 
 | 
                WriteDictKeyValue(sb, key, el[key], indent+1); 
 | 
                hasElement = true; 
 | 
            } 
 | 
            sb.Append("\n"); 
 | 
            AppendIndent(sb, indent); 
 | 
            sb.Append("}"); 
 | 
        } 
 | 
  
 | 
        void WriteArray(StringBuilder sb, JsonElementArray el, int indent) 
 | 
        { 
 | 
            sb.Append("["); 
 | 
            bool hasElement = false; 
 | 
            foreach (var value in el.values) 
 | 
            { 
 | 
                if (hasElement) 
 | 
                    sb.Append(","); // trailing commas not supported 
 | 
                sb.Append("\n"); 
 | 
                AppendIndent(sb, indent+1); 
 | 
  
 | 
                if (value is JsonElementString) 
 | 
                    WriteString(sb, value.AsString()); 
 | 
                else if (value is JsonElementInteger) 
 | 
                    WriteInteger(sb, value.AsInteger()); 
 | 
                else if (value is JsonElementBoolean) 
 | 
                    WriteBoolean(sb, value.AsBoolean()); 
 | 
                else if (value is JsonElementDict) 
 | 
                    WriteDict(sb, value.AsDict(), indent+1); 
 | 
                else if (value is JsonElementArray) 
 | 
                    WriteArray(sb, value.AsArray(), indent+1); 
 | 
                hasElement = true; 
 | 
            } 
 | 
            sb.Append("\n"); 
 | 
            AppendIndent(sb, indent); 
 | 
            sb.Append("]"); 
 | 
        } 
 | 
  
 | 
        public void WriteToFile(string path) 
 | 
        { 
 | 
            File.WriteAllText(path, WriteToString()); 
 | 
        } 
 | 
  
 | 
        public void WriteToStream(TextWriter tw) 
 | 
        { 
 | 
            tw.Write(WriteToString()); 
 | 
        } 
 | 
  
 | 
        public string WriteToString() 
 | 
        { 
 | 
            var sb = new StringBuilder(); 
 | 
            WriteDict(sb, root, 0); 
 | 
            return sb.ToString(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
} // namespace UnityEditor.iOS.Xcode 
 |