straight-shoota
10/16/2018 - 3:16 PM

Crystal::API

Crystal::API

require "json"

module Crystal::API
  class RelativeLocation
    JSON.mapping({
      filename: String,
      line_number: Int32,
      url: String
    })
  end

  class Type
    JSON.mapping({
      html_id: String,
      path: String,
      kind: String,
      full_name: String,
      name: String,
      abstract: Bool,
      superclass: TypeRef?,
      ancestors: Array(TypeRef),
      locations: Array(RelativeLocation),
      repository_name: String,
      program: Bool,
      enum: Bool,
      alias: Bool,
      aliased: String,
      const: Bool,
      constants: Array(Constant),
      included_modules: Array(TypeRef),
      extended_modules: Array(TypeRef),
      subclasses: Array(TypeRef),
      including_types: Array(TypeRef),
      namespace: TypeRef?,
      doc: String?,
      summary: String?,
      class_methods: Array(Method),
      constructors: Array(Method),
      instance_methods: Array(Method),
      macros: Array(Macro),
      types: Array(Type),
    })
  end

  class TypeRef
    JSON.mapping({
      html_id: String?,
      kind: String,
      full_name: String,
      name: String
    })
  end

  class Constant
    JSON.mapping({
      name: String,
      value: String,
      doc: String?,
      summary: String?
    })
  end

  class Macro
    JSON.mapping({
      id: String,
      html_id: String,
      name: String,
      doc: String?,
      summary: String?,
      abstract: Bool,
      args: Array(Argument),
      args_string: String,
      source_link: String?,
      def: CrystalMacro,
    })
  end

  class Method
    JSON.mapping({
      id: String,
      html_id: String,
      name: String,
      doc: String?,
      summary: String?,
      abstract: Bool,
      args: Array(Argument),
      args_string: String,
      source_link: String?,
      def: CrystalDef,
    })
  end

  class Argument
    JSON.mapping({
      name: String,
      doc: String?,
      default_value: String,
      external_name: String,
      restriction: String
    })
  end

  class CrystalDef
    JSON.mapping({
      name: String,
      args: Array(Argument),
      double_splat: Argument?,
      splat_index: Int32?,
      yields: Int32?,
      block_arg: Argument?,
      return_type: String,
      visibility: String,
      body: String
    })
  end

  class CrystalMacro
    JSON.mapping({
      args: Array(Argument),
      double_splat: Argument?,
      splat_index: Int32?,
      block_arg: Argument?,
      visibility: String,
      body: String
    })
  end
end