0001    //
0002    //  Encoder.swift
0003    //  PMJSON
0004    //
0005    //  Created by Kevin Ballard on 2/1/16.
0006    //  Copyright © 2016 Postmates.
0007    //
0008    //  Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
0009    //  http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
0010    //  <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
0011    //  option. This file may not be copied, modified, or distributed
0012    //  except according to those terms.
0013    //
0014    
0015    extension JSON {
0016        /// Encodes a `JSON` to a `String`.
0017        /// - Parameter json: The `JSON` to encode.
0018        /// - Parameter pretty: If `true`, include extra whitespace for formatting. Default is `false`.
0019        /// - Returns: A `String` with the JSON representation of *json*.
0020        public static func encodeAsString(json: JSON, pretty: Swift.Bool = false) -> Swift.String {
0021            var s = ""
0022            encode(json, toStream: &s, pretty: pretty)
0023            return s
0024        }
0025        
0026        /// Encodes a `JSON` to an output stream.
0027        /// - Parameter json: The `JSON` to encode.
0028        /// - Parameter stream: The output stream to write the encoded JSON to.
0029        /// - Parameter pretty: If `true`, include extra whitespace for formatting. Default is `false`.
0030        public static func encode
Encoder.swift:22
        encode(json, toStream: &s, pretty: pretty)
ObjectiveC.swift:46
            JSON.encode(json, toStream: &output, pretty: pretty)
<Target: OutputStreamType>(json: JSON, inout toStream stream: Target, pretty: Swift.Bool = false) { 0031 encode(json, toStream: &stream, indent: pretty ? 0 : nil) 0032 } 0033 0034 private static func encode
Encoder.swift:31
        encode(json, toStream: &stream, indent: pretty ? 0 : nil)
Encoder.swift:120
            encode(value, toStream: &stream, indent: indented)
Encoder.swift:147
            encode(elt, toStream: &stream, indent: indented)
<Target: OutputStreamType>(json: JSON, inout toStream stream: Target, indent: Int?) { 0035 switch json { 0036 case .Null: encodeNull(&stream) 0037 case .Bool(let b): encodeBool(b, toStream: &stream) 0038 case .Int64(let i): encodeInt64(i, toStream: &stream) 0039 case .Double(let d): encodeDouble(d, toStream: &stream) 0040 case .String(let s): encodeString(s, toStream: &stream) 0041 case .Object(let obj): encodeObject(obj, toStream: &stream, indent: indent) 0042 case .Array(let ary): encodeArray(ary, toStream: &stream, indent: indent) 0043 } 0044 } 0045 0046 private static func encodeNull
Encoder.swift:36
        case .Null: encodeNull(&stream)
<Target: OutputStreamType>(inout stream: Target) { 0047 stream.write("null") 0048 } 0049 0050 private static func encodeBool
Encoder.swift:37
        case .Bool(let b): encodeBool(b, toStream: &stream)
<Target: OutputStreamType>(value: Swift.Bool, inout toStream stream: Target) { 0051 stream.write(value ? "true" : "false") 0052 } 0053 0054 private static func encodeInt64
Encoder.swift:38
        case .Int64(let i): encodeInt64(i, toStream: &stream)
<Target: OutputStreamType>(value: Swift.Int64, inout toStream stream: Target) { 0055 stream.write(Swift.String(value)) 0056 } 0057 0058 private static func encodeDouble
Encoder.swift:39
        case .Double(let d): encodeDouble(d, toStream: &stream)
<Target: OutputStreamType>(value: Swift.Double, inout toStream stream: Target) { 0059 stream.write(Swift.String(value)) 0060 } 0061 0062 private static func encodeString
Encoder.swift:40
        case .String(let s): encodeString(s, toStream: &stream)
Encoder.swift:118
            encodeString(key, toStream: &stream)
<Target: OutputStreamType>(value: Swift.String, inout toStream stream: Target) { 0063 stream.write("\"") 0064 let scalars = value.unicodeScalars 0065 var start = scalars.startIndex 0066 let end = scalars.endIndex 0067 var idx = start 0068 while idx < scalars.endIndex { 0069 let s: Swift.String 0070 let c = scalars[idx] 0071 switch c { 0072 case "\\": s = "\\\\" 0073 case "\"": s = "\\\"" 0074 case "\n": s = "\\n" 0075 case "\r": s = "\\r" 0076 case "\t": s = "\\t" 0077 case "\u{8}": s = "\\b" 0078 case "\u{C}": s = "\\f" 0079 case "\0"..<"\u{10}": 0080 s = "\\u000\(Swift.String(c.value, radix: 16, uppercase: true))" 0081 case "\u{10}"..<" ": 0082 s = "\\u00\(Swift.String(c.value, radix: 16, uppercase: true))" 0083 default: 0084 idx = idx.successor() 0085 continue 0086 } 0087 if idx != start { 0088 stream.write(Swift.String(scalars[start..<idx])) 0089 } 0090 stream.write(s) 0091 idx = idx.successor() 0092 start = idx 0093 } 0094 if start != end { 0095 Swift.String(scalars[start..<end]).writeTo(&stream) 0096 } 0097 stream.write("\"") 0098 } 0099 0100 private static func encodeObject
Encoder.swift:41
        case .Object(let obj): encodeObject(obj, toStream: &stream, indent: indent)
<Target: OutputStreamType>(object: JSONObject, inout toStream stream: Target, indent: Int?) { 0101 let indented = indent.map({$0+1}) 0102 if let indent = indented { 0103 stream.write("{\n") 0104 writeIndent(indent, toStream: &stream) 0105 } else { 0106 stream.write("{") 0107 } 0108 var first = true 0109 for (key, value) in object { 0110 if first { 0111 first = false 0112 } else if let indent = indented { 0113 stream.write(",\n") 0114 writeIndent(indent, toStream: &stream) 0115 } else { 0116 stream.write(",") 0117 } 0118 encodeString(key, toStream: &stream) 0119 stream.write(indented != nil ? ": " : ":") 0120 encode(value, toStream: &stream, indent: indented) 0121 } 0122 if let indent = indent { 0123 stream.write("\n") 0124 writeIndent(indent, toStream: &stream) 0125 } 0126 stream.write("}") 0127 } 0128 0129 private static func encodeArray
Encoder.swift:42
        case .Array(let ary): encodeArray(ary, toStream: &stream, indent: indent)
<Target: OutputStreamType>(array: JSONArray, inout toStream stream: Target, indent: Int?) { 0130 let indented = indent.map({$0+1}) 0131 if let indent = indented { 0132 stream.write("[\n") 0133 writeIndent(indent, toStream: &stream) 0134 } else { 0135 stream.write("[") 0136 } 0137 var first = true 0138 for elt in array { 0139 if first { 0140 first = false 0141 } else if let indent = indented { 0142 stream.write(",\n") 0143 writeIndent(indent, toStream: &stream) 0144 } else { 0145 stream.write(",") 0146 } 0147 encode(elt, toStream: &stream, indent: indented) 0148 } 0149 if let indent = indent { 0150 stream.write("\n") 0151 writeIndent(indent, toStream: &stream) 0152 } 0153 stream.write("]") 0154 } 0155 0156 private static func writeIndent
Encoder.swift:104
            writeIndent(indent, toStream: &stream)
Encoder.swift:114
                writeIndent(indent, toStream: &stream)
Encoder.swift:124
            writeIndent(indent, toStream: &stream)
Encoder.swift:133
            writeIndent(indent, toStream: &stream)
Encoder.swift:143
                writeIndent(indent, toStream: &stream)
Encoder.swift:151
            writeIndent(indent, toStream: &stream)
<Target: OutputStreamType>(indent: Int, inout toStream stream: Target) { 0157 for _ in 4.stride(through: indent, by: 4) { 0158 stream.write(" ") 0159 } 0160 switch indent % 4 { 0161 case 1: stream.write(" ") 0162 case 2: stream.write(" ") 0163 case 3: stream.write(" ") 0164 default: break 0165 } 0166 } 0167 } 0168