Add more query features
This commit is contained in:
parent
a1444e162f
commit
7a0e7d3329
|
@ -179,6 +179,8 @@ pub type JsonQuery {
|
||||||
IndexOr(query: JsonQuery, index: Int, or: JsonValue)
|
IndexOr(query: JsonQuery, index: Int, or: JsonValue)
|
||||||
Filter(query: JsonQuery, predicate: fn(JsonValue) -> Bool)
|
Filter(query: JsonQuery, predicate: fn(JsonValue) -> Bool)
|
||||||
Map(query: JsonQuery, mapping: fn(JsonValue) -> JsonValue)
|
Map(query: JsonQuery, mapping: fn(JsonValue) -> JsonValue)
|
||||||
|
MapKeys(query: JsonQuery, mapping: fn(String) -> String)
|
||||||
|
MapValues(query: JsonQuery, mapping: fn(String, JsonValue) -> JsonValue)
|
||||||
FilterMap(query: JsonQuery, mapping: fn(JsonValue) -> Result(JsonValue, Nil))
|
FilterMap(query: JsonQuery, mapping: fn(JsonValue) -> Result(JsonValue, Nil))
|
||||||
ForEach(query: JsonQuery)
|
ForEach(query: JsonQuery)
|
||||||
ForEachOk(query: JsonQuery)
|
ForEachOk(query: JsonQuery)
|
||||||
|
@ -192,6 +194,8 @@ type InvJsonQuery {
|
||||||
InvIndexOr(index: Int, or: JsonValue, query: InvJsonQuery)
|
InvIndexOr(index: Int, or: JsonValue, query: InvJsonQuery)
|
||||||
InvFilter(predicate: fn(JsonValue) -> Bool, query: InvJsonQuery)
|
InvFilter(predicate: fn(JsonValue) -> Bool, query: InvJsonQuery)
|
||||||
InvMap(mapping: fn(JsonValue) -> JsonValue, query: InvJsonQuery)
|
InvMap(mapping: fn(JsonValue) -> JsonValue, query: InvJsonQuery)
|
||||||
|
InvMapKeys(mapping: fn(String) -> String, query: InvJsonQuery)
|
||||||
|
InvMapValues(mapping: fn(String, JsonValue) -> JsonValue, query: InvJsonQuery)
|
||||||
InvFilterMap(
|
InvFilterMap(
|
||||||
mapping: fn(JsonValue) -> Result(JsonValue, Nil),
|
mapping: fn(JsonValue) -> Result(JsonValue, Nil),
|
||||||
query: InvJsonQuery,
|
query: InvJsonQuery,
|
||||||
|
@ -211,6 +215,10 @@ fn invert_query_rec(query: JsonQuery, state: InvJsonQuery) -> InvJsonQuery {
|
||||||
Filter(query, predicate) ->
|
Filter(query, predicate) ->
|
||||||
invert_query_rec(query, InvFilter(predicate, state))
|
invert_query_rec(query, InvFilter(predicate, state))
|
||||||
Map(query, mapping) -> invert_query_rec(query, InvMap(mapping, state))
|
Map(query, mapping) -> invert_query_rec(query, InvMap(mapping, state))
|
||||||
|
MapKeys(query, mapping) ->
|
||||||
|
invert_query_rec(query, InvMapKeys(mapping, state))
|
||||||
|
MapValues(query, mapping) ->
|
||||||
|
invert_query_rec(query, InvMapValues(mapping, state))
|
||||||
FilterMap(query, mapping) ->
|
FilterMap(query, mapping) ->
|
||||||
invert_query_rec(query, InvFilterMap(mapping, state))
|
invert_query_rec(query, InvFilterMap(mapping, state))
|
||||||
ForEach(query) -> invert_query_rec(query, InvForEach(state))
|
ForEach(query) -> invert_query_rec(query, InvForEach(state))
|
||||||
|
@ -294,6 +302,26 @@ fn query_json_rec(
|
||||||
|> query_json_rec(q)
|
|> query_json_rec(q)
|
||||||
j -> Error(UnexpectedType(j))
|
j -> Error(UnexpectedType(j))
|
||||||
}
|
}
|
||||||
|
InvMapKeys(mapping, q) ->
|
||||||
|
case json {
|
||||||
|
Object(obj) ->
|
||||||
|
obj
|
||||||
|
|> dict.to_list
|
||||||
|
|> list.map(fn(kv) { #(mapping(kv.0), kv.1) })
|
||||||
|
|> dict.from_list
|
||||||
|
|> Object
|
||||||
|
|> query_json_rec(q)
|
||||||
|
j -> Error(UnexpectedType(j))
|
||||||
|
}
|
||||||
|
InvMapValues(mapping, q) ->
|
||||||
|
case json {
|
||||||
|
Object(obj) ->
|
||||||
|
obj
|
||||||
|
|> dict.map_values(mapping)
|
||||||
|
|> Object
|
||||||
|
|> query_json_rec(q)
|
||||||
|
j -> Error(UnexpectedType(j))
|
||||||
|
}
|
||||||
InvFilterMap(mapping, q) ->
|
InvFilterMap(mapping, q) ->
|
||||||
case json {
|
case json {
|
||||||
Array(arr) ->
|
Array(arr) ->
|
||||||
|
|
Loading…
Reference in New Issue