Regexp

Go like Regular expressions

regexp

regexp "[0-9]" |type?
; returns native

regexp//is-match

regexp "[0-9]" |is-match "5"
; returns 1
regexp "[0-9]" |is-match "a"
; returns 0

regexp//submatch?

regexp "x([0-9]+)y" |submatch? "x123y"
; returns "123"

regexp//submatches?

regexp "x([0-9]+)y" |submatches? "x123y x234y"
; returns { "123" }

regexp//submatches\all?

regexp "x([0-9]+)(y+)?" |submatches\all? "x11yy x22"
; returns { { "11" "yy" } { "22" "" } }

regexp//find-all

regexp "[0-9]+" |find-all "x123y x234y"
; returns { "123" "234" }

regexp//match?

regexp "[0-9]+c+" |match? "aa33bb55cc"
; returns "55cc"

regexp//replace-all

regexp "[0-9]+" |replace-all "x123y x234y" "XXX"
; returns "xXXXy xXXXy"

Validation

validation dialect for Rye values

validate

validate dict { a: 1 } { a: required }
; returns dict { a 1 }
validate dict { a: 1 } { b: optional 2 }
; returns dict { b 2 }
validate dict { a: 1 } { a: optional 0 b: optional 2 }
; returns dict { b 2 a 1 }
validate dict { a: 1 } { a: required integer }
; returns dict { a 1 }
validate dict { a: "1" } { a: required integer }
; returns dict { a 1 }
validate dict { a: "1" } { a: required integer } |-> "a" |type?
; returns integer
validate dict { a: 3.14 } { a: required decimal }
; returns dict { a 3.14 }
validate dict { a: 3 } { a: required decimal }
; returns dict { a 3 }
validate dict { a: "3.14" } { a: required decimal }
; returns dict { a 3.14 }
validate dict { a: "3.14" } { a: required decimal } |-> "a" |type?
; returns decimal
validate dict { a: "jim" } { a: required string }
; returns dict { a "jim" }
validate dict { a: "e@ma.il" } { a: required email }
; returns dict { a "e@ma.il" }
validate dict { a: "e@ma.il" } { a: required email } |-> "a" |type?
; returns string
validate dict { a: "30.12.2024" } { a: required date }
; returns dict { a 2024-12-30 }
validate dict { a: "2024-12-30" } { a: required date }
; returns dict { a 2024-12-30 }
validate dict { a: "2024-12-30" } { a: required date } |-> "a" |type?
; returns date
validate dict { a: 5 } { a: required integer check { < 10 } }
; returns dict { a 5 }
validate dict { a: 5 } { a: required integer calc { + 10 } }
; returns dict { a 15 }
validate dict { a: 5 } { b: required } |disarm |type?
; returns error
validate dict { b: "5c" } { b: optional 0 integer } |disarm |type?
; returns error
validate dict { b: "2x0" } { b: required decimal } |disarm |status?
; returns 403
validate dict { b: "not-mail" } { b: required email } |disarm |message?
; returns "validation error"
validate dict { b: "2023-1-1" } { b: required date } |disarm |details?
; returns dict { b "not date" }

validate>ctx

validate>ctx dict { a: 1 } { a: required } |type?
; returns ctx
validate>ctx dict { a: 1 } { a: optional 0 } |-> 'a
; returns 1

JSON

parsing and generating JSON

parse-json

"[ 1, 2, 3 ]" |parse-json |length?
; returns 3
"[ 1, 2, 3 ]" |parse-json |type?
; returns list

to-json

list { 1 2 3 } |to-json
; returns "[1, 2, 3] "

to-json\lines

table { "a" "b" } { 2 "x" 3 "y" } |to-json\lines
; returns "{"a": 2, "b": "x"} 
; {"a": 3, "b": "y"} 
; "

SXML

streaming, Sax like XML dialect (still in design)

rye-reader//do-sxml

"<scene><bot>C3PO</bot><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { _ [ .prns ] }
; prints "C3PO R2D2 Luke "
"<scene><bot>C3PO</bot><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { <bot> { _ [ .prns ] } }
; prints "C3PO R2D2 "
"<scene><ship>XWing</ship><bot>R2D2</bot><jedi>Luke</jedi></scene>" |reader .do-sxml { <bot> <jedi> { _ [ .prns ] } }
; prints "R2D2 Luke "
"<scene><xwing><bot>R2D2</bot><person>Luke</person></xwing><destroyer><person>Vader</person></destroyer></scene>" |reader .do-sxml { <xwing> { <person> { _ [ .prns ] } } }
; prints "Luke "

rye-sxml-start//attr?

"<scene><ship type="xwing"><person age="25">Luke</person></ship><ship type="destroyer"><person age="55">Vader</person></ship></scene>" |reader .do-sxml { <ship> [ .attr? 0 |prns ] }
; prints "xwing destroyer "
"<scene><ship type="xwing"><person age="25">Luke</person></ship><ship type="destroyer"><person age="55">Vader</person></ship></scene>" |reader .do-sxml { <person> [ .attr? 0 |prns ] }
; prints "25 55 "

HTML

streaming, Sax like HTML dialect (still in design)

unescape\html

unescape\html "&gt;hello&lt;"
; returns ">hello<"

escape\html

escape\html "<hello>"
; returns "&lt;hello&gt;"

html->markdown

html->markdown "<h1>title</h1><p>para</p>"
; returns "# title
; 
; para"

rye-reader//parse-html

"<html><body><div class='menu'><a href='/'>home</a><a href='/about/'>about</a>" |reader .parse-html { <a> [ .attr? 'href |prns ] }
; prints "/ /about/ "