Описывает 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