text_document_client_capabilities.pony

use json = "../../../../json"

use ".."

interface val TextDocumentClientCapabilities
  fun val definition(): (DefinitionClientCapabilities | None)
  fun val publishDiagnostics(): (PublishDiagnosticsClientCapabilities | None)

primitive ParseTextDocumentClientCapabilities
  fun apply(obj: json.Object val)
    : (TextDocumentClientCapabilities | String)
  =>
    let definition' =
      try
        match obj("definition")?
        | let d_obj: json.Object val =>
          match ParseDefinitionClientCapabilities(d_obj)
          | let d: DefinitionClientCapabilities =>
            d
          | let err: String =>
            return err
          end
        else
          return "textDocument.definition must be a JSON object"
        end
      end
    let publishDiagnostics' =
      try
        match obj("publishDiagnostics")?
        | let pd_obj: json.Object val =>
          match ParsePublishDiagnosticsClientCapabilities(pd_obj)
          | let pd: PublishDiagnosticsClientCapabilities =>
            pd
          | let err: String =>
            return err
          end
        else
          return "textDocument.publishDiagnostics must be a JSON object"
        end
      end
    object val is TextDocumentClientCapabilities
      fun val definition(): (DefinitionClientCapabilities | None) => definition'
      fun val publishDiagnostics()
        : (PublishDiagnosticsClientCapabilities | None)
      =>
        publishDiagnostics'
    end

interface val PublishDiagnosticsClientCapabilities
  fun val relatedInformation(): (Bool | None)
  fun val tagSupport(): (TagSupport | None)
  fun val versionSupport(): (Bool | None)
  fun val codeDescriptionSupport(): (Bool | None)
  fun val dataSupport(): (Bool | None)

primitive ParsePublishDiagnosticsClientCapabilities
  fun apply(obj: json.Object val)
    : (PublishDiagnosticsClientCapabilities | String)
  =>
    let relatedInformation' =
      match try obj("relatedInformation")? end
      | let bool: Bool =>
        bool
      | let item: json.Item =>
        return "publishDiagnostics.relatedInformation must be a boolean"
      end
    let tagSupport' =
      try
        match obj("tagSupport")?
        | let ts_obj: json.Object val =>
          match ParseTagSupport(ts_obj)
          | let ts: TagSupport =>
            ts
          | let err: String =>
            return err
          end
        else
          return "publishDiagnostics.tagSupport must be a JSON object"
        end
      end
    let versionSupport' =
      match try obj("versionSupport")? end
      | let bool: Bool =>
        bool
      | let item: json.Item =>
        return "publishDiagnostics.versionSupport must be a boolean"
      end
    let codeDescriptionSupport' =
      match try obj("codeDescriptionSupport")? end
      | let bool: Bool =>
        bool
      | let item: json.Item =>
        return "publishDiagnostics.codeDescriptionSupport must be a boolean"
      end
    let dataSupport' =
      match try obj("dataSupport")? end
      | let bool: Bool =>
        bool
      | let item: json.Item =>
        return "publishDiagnostics.dataSupport must be a boolean"
      end
    object val is PublishDiagnosticsClientCapabilities
      fun relatedInformation(): (Bool | None) => relatedInformation'
      fun tagSupport(): (TagSupport | None) => tagSupport'
      fun versionSupport(): (Bool | None) => versionSupport'
      fun codeDescriptionSupport(): (Bool | None) => codeDescriptionSupport'
      fun dataSupport(): (Bool | None) => dataSupport'
    end

interface val TagSupport
  fun val valueSet(): Array[DiagnosticTag] val

primitive ParseTagSupport
  fun apply(obj: json.Object val): (TagSupport | String) =>
    let valueSet': Array[DiagnosticTag] val =
      try
        match obj("valueSet")?
        | let vs_seq: json.Sequence val =>
          let values: Array[DiagnosticTag] trn = Array[DiagnosticTag]
          for item in vs_seq.values() do
            values.push(
              match item
              | let n: I128 if n == DiagnosticTagUnnecessary() =>
                DiagnosticTagUnnecessary
              | let n: I128 if n == DiagnosticTagDeprecated() =>
                DiagnosticTagDeprecated
              else
                return "tagSupport.valueSet.x must be (1 | 2)"
              end)
          end
          consume values
        else
          return "tagSupport.valueSet must be a JSON sequence"
        end
      else
        return "tagSupport.valueSet must be a JSON sequence"
      end
    object val is TagSupport
      fun val valueSet(): Array[DiagnosticTag] val => valueSet'
    end