shrub/pkg/arvo/lib/hall-json.hoon
2019-09-30 01:31:46 +04:00

611 lines
16 KiB
Plaintext

::
:::: /lib/hall-json/hoon
::
/- hall
=, hall
::
|_ bol/bowl:gall
++ en-tape ::: sur to tape
|%
++ circ ::: circle
|= a/circle
:(weld (scow %p hos.a) "/" (trip nom.a))
::
++ rang ::: range
|= a/range
?~ a ~
;: weld
"/" (scow hed.u.a)
?~ tal.u.a ~
(scow u.tal.u.a)
==
::
++ sorc ::: source
|= a/source
(weld (circ cir.a) (rang ran.a))
--
::
++ de-tape ::: tape to sur (parse)
|%
++ circ ::: circle
;~((glue net) ;~(pfix sig fed:ag) urs:ab)
::
++ pont
;~ pfix net
%+ sear
|= a/coin
^- (unit place)
?+ a ~
[%$ %da @da] `p.a
[%$ %ud @ud] `p.a
==
nuck:so
==
::
++ sorc
;~(plug circ (punt ;~(plug pont (punt pont))))
--
::
++ enjs ::: sur to json
=, enjs:format
|%
::TODO these first few should probably make their way
:: into the stdlib...
++ sa ::: set as array
|* {a/(set) b/$-(* json)}
^- json
[%a (turn ~(tap in a) b)]
::
++ mo ::: map as object
|* {a/(map) b/$-(* @t) c/$-(* json)}
^- json
=- (pairs (turn ~(tap by a) -))
|* {k/* v/*} [(b k) (c v)]
::
++ dank ::: tank
|= a=^tank
?: ?=($leaf -.a) (frond %leaf (tape p.a))
:: TODO: No idea what a plum is, but it was recently added
::
?: ?=($plum -.a) (frond %plum [%o ~])
%+ frond -.a
%- pairs
?- -.a
$palm
:+ :- %style
%- pairs :~
mid+(tape p.p.a)
cap+(tape q.p.a)
open+(tape r.p.a)
close+(tape s.p.a)
==
lines+a+(turn q.a dank)
~
$rose
:+ :- %style
%- pairs :~
mid+(tape p.p.a)
open+(tape q.p.a)
close+(tape r.p.a)
==
lines+a+(turn q.a dank)
~
==
::
++ cord ::: string from cord
|= a/@t
s+a
::
++ mabe ::: null or value
|* {a/(unit) b/$-(* json)}
^- json
?~(a ~ (b u.a))
::
::: ||
::: || %query-models
::: ||
::: models relating to queries, their results and updates.
::+|
::
++ pici ::: prize-client
|= a/prize-client
^- json
%- pairs :~
:- %gys
=- (pairs ~(tap by (~(run by gys.a) -)))
|=((set (set circle)) (sa +< audi))
::
nis+(mo nis.a (cury scot %p) cord)
==
::
++ ruci ::: rumor-client
|= a/rumor-client
^- json
%+ frond -.a
?- -.a
$glyph (digy +.a)
$nick (dini +.a)
==
::
++ pack ::: package
|= a/package
^- json
%- pairs :~
nes+a+(turn nes.a enve) ::TODO maybe map
cos+(loby cos.a)
pes+(crow pes.a)
==
::
++ digy ::: diff-glyph
|= a/diff-glyph
^- json
%- pairs :~
bin+b+bin.a
gyf+s+gyf.a
aud+(audi aud.a)
==
::
++ dini ::: diff-nick
|= a/diff-nick
^- json
(pairs who+(ship who.a) nic+s+nic.a ~)
::
++ ruso ::: rumor-story
|= a/rumor-story
^- json
%+ frond -.a
?+ -.a !!
$new (conf cof.a)
:: $bear not needed
$config (pairs cir+(circ cir.a) dif+(dico dif.a) ~)
$status %- pairs :~
cir+(circ cir.a)
who+(ship who.a)
dif+(disa dif.a)
==
$remove b+&
$gram (enve nev.a)
==
::
++ dico ::: diff-config
|= a/diff-config
^- json
%+ frond -.a
?- -.a
$full (conf cof.a)
$source (pairs add+b+add.a src+(sorc src.a) ~)
$caption s+cap.a
$usage (pairs add+b+add.a tas+(sa tas.a cord) ~)
$filter (filt fit.a)
$secure s+sec.a
$permit (pairs add+b+add.a sis+(sa sis.a ship) ~)
$remove b+&
$read (numb red.a)
==
::
++ disa ::: diff-status
|= a/diff-status
^- json
%+ frond -.a
?- -.a
$full (stat sat.a)
$presence s+pec.a
$human (dihu dif.a)
$remove b+&
==
::
++ dihu ::: diff-human
|= a/diff-human
^- json
%+ frond -.a
?- -.a
$full (huma man.a)
$handle (frond %han (mabe han.a cord))
$true (frond %tru (mabe tru.a trun))
==
::
::: ||
::: || %circles
::: ||
::: messaging targets and their metadata
::+|
::
++ circ ::: circle
|= a/circle
^- json
s+(crip (circ:en-tape a))
::
++ loby ::: lobby
|= a/lobby
%- pairs :~
loc+(conf loc.a)
rem+(mo rem.a (cork circ:en-tape crip) conf)
==
::
++ conf ::: config
|= a/config
^- json
%- pairs :~
src+(sa src.a sorc)
cap+s+cap.a
tag+(sa tag.a cord)
fit+(filt fit.a)
con+(cont con.a)
red+(numb red.a)
==
::
++ sorc ::: source
|= a/source
^- json
s+(crip (sorc:en-tape a))
::
++ filt ::: filter
|= a/filter
^- json
(pairs cas+b+cas.a utf+b+utf.a ~)
::
++ cont ::: control
|= a/control
^- json
(pairs sec+s+sec.a sis+(sa sis.a ship) ~)
::
++ crow ::: crowd
|= a/crowd
^- json
%- pairs :~
loc+(grop loc.a)
rem+(mo rem.a (cork circ:en-tape crip) grop)
==
::
++ grop ::: group
|= a/group
^- json
(mo a (cury scot %p) stat)
::
++ stat ::: status
|= a/status
^- json
(pairs pec+s+pec.a man+(huma man.a) ~)
::
++ huma ::: human
|= a/human
^- json
(pairs han+(mabe han.a cord) tru+(mabe tru.a trun) ~)
::
++ trun ::: truename
|= a/truename
^- json
(pairs fir+s+fir.a mid+(mabe mid.a cord) las+s+las.a ~)
::
::: ||
::: || %message-data
::: ||
::: structures for containing main message data
::+|
::
++ enve ::: envelope
|= a/envelope
^- json
(pairs num+(numb num.a) gam+(gram gam.a) ~)
::
++ gram ::: telegram
|= a/telegram
^- json
%- pairs :~
aut+(ship aut.a)
::TODO can we avoid this code duplication somehow?
uid+s+(scot %uv uid.a)
aud+(audi aud.a)
wen+(time wen.a)
sep+(spec sep.a)
==
::
++ thot ::: thought
|= a/thought
^- json
%- pairs :~
uid+s+(scot %uv uid.a)
aud+(audi aud.a)
wen+(time wen.a)
sep+(spec sep.a)
==
::
++ spec ::: speech
|= a/speech
^- json
:: only %url has just a single piece of data.
?: ?=($url -.a)
(frond %url s+(crip (apix:en-purl:html url.a)))
%+ frond -.a
%- pairs
?- -.a
$lin ~[pat+b+pat.a msg+s+msg.a]
$exp ~[exp+s+exp.a res+a+(turn res.a tank)]
$ire ~[top+s+(scot %uv top.a) sep+(spec sep.a)] ::TODO @uv as number?
$fat ~[tac+(atta tac.a) sep+(spec sep.a)]
$inv ~[inv+b+inv.a cir+(circ cir.a)]
$app ~[app+s+app.a sep+(spec sep.a)]
==
::
++ atta ::: attache
|= a/attache
^- json
%+ frond -.a
?- -.a
$name (pairs nom+s+nom.a tac+(atta tac.a) ~)
$text s+(of-wain:format +.a)
$tank a+(turn +.a tank)
==
::
::: ||
::: || %message-metadata
::: ||
::: structures for containing message metadata
::+|
::
++ audi ::: audience
|= a/audience
^- json
(sa a circ)
--
::
++ dejs ::: json to sur
=, dejs-soft:format
|%
::TODO these first few should maybe make their way
:: into the stdlib...
++ re ::: recursive reparsers
|* {gar/* sef/_|.(fist)}
|= jon/json
^- (unit _gar)
=- ~! gar ~! (need -) -
((sef) jon)
::
++ as ::: array as set
|* a/fist
(cu ~(gas in *(set _(need *a))) (ar a))
::
++ dank ::: tank
^- $-(json (unit tank))
%+ re *tank |. ~+
%- of :~
leaf+sa
palm+(ot style+(ot mid+sa cap+sa open+sa close+sa ~) lines+(ar dank) ~)
rose+(ot style+(ot mid+sa open+sa close+sa ~) lines+(ar dank) ~)
==
::
::: ||
::: || %query-models
::: ||
::: models relating to queries, their results and updates.
::+|
::
++ pici ::: prize-client
^- $-(json (unit prize-client))
%- ot :~
gys+(om (as (as circ)))
nis+(op fed:ag so)
==
::
++ ruci ::: rumor-client
^- $-(json (unit rumor-client))
%- of :~
glyph+digy
nick+dini
==
::
++ pack ::: package
^- $-(json (unit package))
%- ot :~
nes+(ar enve)
cos+loby
pes+crow
==
::
++ digy ::: diff-glyph
^- $-(json (unit diff-glyph))
(ot bin+bo gyf+so aud+audi ~)
::
++ dini ::: diff-nick
^- $-(json (unit diff-nick))
(ot who+(su fed:ag) nic+so ~)
::
++ ruso ::: rumor-story
^- $-(json (unit rumor-story))
%- of :~
new+conf
:: bear not needed
config+(ot cir+circ dif+dico ~)
status+(ot cir+circ who+(su fed:ag) dif+disa ~)
remove+ul
gram+(ot src+circ nev+enve ~)
==
::
++ dico ::: diff-config
^- $-(json (unit diff-config))
%- of :~
full+conf
source+(ot add+bo src+sorc ~)
usage+(ot add+bo tas+(as so) ~)
caption+so
filter+filt
secure+secu
permit+(ot add+bo sis+(as (su fed:ag)) ~)
remove+ul
==
::
++ disa ::: diff-status
^- $-(json (unit diff-status))
%- of :~
full+(ot pec+pres man+huma ~)
presence+pres
human+dihu
remove+ul
==
::
++ dihu ::: diff-human
^- $-(json (unit diff-human))
%- of :~
full+huma
handle+(mu so)
true+(mu trun)
==
::
::: ||
::: || %circles
::: ||
::: messaging targets and their metadata.
::+|
::
::TODO maybe just an object?
++ circ ::: circle
^- $-(json (unit circle))
(su circ:de-tape)
::
++ loby ::: lobby
^- $-(json (unit lobby))
(ot loc+conf rem+(op circ:de-tape conf) ~)
::
++ conf ::: config
^- $-(json (unit config))
%- ot :~
src+(as sorc)
cap+so
tag+(as so)
fit+filt
con+cont
red+ni
==
::
::TODO maybe just an object?
++ sorc ::: source
^- $-(json (unit source))
(su sorc:de-tape)
::
++ filt ::: filter
^- $-(json (unit filter))
(ot cas+bo utf+bo ~)
::
++ cont ::: control
^- $-(json (unit control))
(ot sec+secu sis+(as (su fed:ag)) ~)
::
++ secu ::: security
^- $-(json (unit security))
(su (perk %channel %village %journal %mailbox %custom ~))
::
++ crow ::: crowd
^- $-(json (unit crowd))
(ot loc+grop rem+(op circ:de-tape grop) ~)
::
++ grop ::: group
^- $-(json (unit group))
(op fed:ag stat)
::
++ stat ::: status
^- $-(json (unit status))
(ot pec+pres man+huma ~)
::
++ pres ::: presence
^- $-(json (unit presence))
(su (perk %gone %idle %hear %talk ~))
::
++ huma ::: human
^- $-(json (unit human))
(ot han+(mu so) tru+(mu trun) ~)
::
++ trun ::: truename
^- $-(json (unit truename))
(ot fir+so mid+(mu so) las+so ~)
::
::: ||
::: || %message-data
::: ||
::: structures for containing main message data.
::+|
::
++ enve ::: envelope
^- $-(json (unit envelope))
(ot num+ni gam+gram ~)
::
++ gram ::: telegram
^- $-(json (unit telegram))
%- ot :~
aut+(su fed:ag)
::TODO can we do anything about this duplication?
uid+seri
aud+audi
wen+di
sep+spec
==
::
++ thot ::: thought
^- $-(json (unit thought))
%- ot :~
uid+seri
aud+audi
wen+di
sep+spec
==
::
++ spec ::: speech
^- $-(json (unit speech))
%+ re *speech |. ~+
%- of :~
lin+(ot pat+bo msg+so ~)
url+(su aurf:de-purl:html)
exp+eval
ire+(ot top+seri sep+spec ~)
fat+(ot tac+atta sep+spec ~)
inv+(ot inv+bo cir+circ ~)
app+(ot app+so sep+spec ~)
==
::
++ eval ::: %exp speech
::: extract contents of an %exp speech, evaluating
::: the {exp} if there is no {res} yet.
::
|= a/json
^- (unit {cord (list tank)})
=+ exp=((ot exp+so ~) a)
?~ exp ~
:+ ~ u.exp
=+ res=((ot res+(ar dank) ~) a)
?^ res u.res
:: XX revisit
::
:: this double-virtualizes and clams to disable .^
:: the subject of the eval should include [our now eny]
::
;; (list tank)
=< +>
%+ mong
:- mute
|.([(sell (slap !>(..^zuse) (ream u.exp)))]~)
|=(^ ~)
::
++ atta ::: attache
^- $-(json (unit attache))
%+ re *attache |. ~+
%- of :~
name+(ot nom+so tac+atta ~)
text+(cu to-wain:format so)
tank+(ar dank)
==
::
::: ||
::: || %message-metadata
::: ||
:: structures for containing message metadata.
::+|
::
++ seri ::: serial
^- $-(json (unit serial))
(ci (slat %uv) so)
::
++ audi ::: audience
^- $-(json (unit audience))
(as circ)
--
--