JsType

sealed trait JsType

Описывает Json тип

Есть простые типы:

  • JsNull - соответ литералу null
  • JsStr - соответ строковому литералу
  • JsFloat
  • JsInt
  • JsBig
  • JsBool

Составные типы

  • JsArray - массив
  • Prod - "тип-произведение"
  • тип-произведение - это тип к элементу которого можно обратиься по ключу
  • приминительно к JSON это может быть:
    • массив, где ключ - это цело число
    • объект, где ключ - это имя/идентификатор поля объекта
  • Sum - "тип-сумма"
  • тип-сумма - это тип который может быть либо типом А, либо типом Б, либо В .... опеределить какого именного типа возможно по функции того или иного языка (например в js это функция typeof() / а для java - оператор instanceOf )

Пример:

val desc =
 // исследуемые json
 List(
   """{ "a": 1, "b":2 }""",
   """{ "a": 123, "c":"abc" }""",
   """{ "a": true, "d":[1,2], "b": { "x": 1 } }""",
 ).map( Parser.parse )
 .map( _.toOption )
 .flatten // Получаем тип List[AST]
 .foldLeft(
   Prod(Map.empty):JsType // Теперь каждый тип ast будет объеденен с данным
 ){ case (jsType,ast) => jsType.merge(JsonDescribe.describe(ast)) } // объединение типов

в результате будет такое

{
 a : Sum(
   2 > JsInt
   1 > JsBool
 )
 b : Sum(
   1 > JsInt
   1 > {
     x : JsInt
   }
 )
 c : JsStr
 d : JsArray
}
  • {} - обозначер Prod тип ("тип-произведение")
  • ''имя'' : ''тип'' - описывает тип поля объекта (prod)
  • Sum() - обозначер Sum тип
  • ''число'' > ''тип'' - указывает на элемент типа-суммы и сколько данный тип встретился
    • для типа-произведения число всегда будет 1
Companion:
object
class Object
trait Matchable
class Any
object JsArray.type
object JsBig.type
object JsBool.type
object JsFloat.type
object JsInt.type
object JsNull.type
object JsStr.type
class Prod
class Sum

Value members

Abstract methods