Mercurial > lbo > hg > juliaplay
changeset 37:37a528750178
Make JSON struct parser generator work
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Fri, 24 Mar 2023 22:07:52 +0100 |
parents | 03d20a4dd8f2 |
children | bae384998d85 |
files | julia/parallel/ParallelProcessing/src/ParallelProcessing.jl julia/parallel/ParallelProcessing/src/metaparser.jl |
diffstat | 2 files changed, 19 insertions(+), 53 deletions(-) [+] |
line wrap: on
line diff
--- a/julia/parallel/ParallelProcessing/src/ParallelProcessing.jl Fri Mar 24 21:30:03 2023 +0100 +++ b/julia/parallel/ParallelProcessing/src/ParallelProcessing.jl Fri Mar 24 22:07:52 2023 +0100 @@ -1,6 +1,7 @@ module ParallelProcessing +include("json.jl") + include("jsonparser.jl") -include("json.jl") include("metaparser.jl") end # module ParallelProcessing
--- a/julia/parallel/ParallelProcessing/src/metaparser.jl Fri Mar 24 21:30:03 2023 +0100 +++ b/julia/parallel/ParallelProcessing/src/metaparser.jl Fri Mar 24 22:07:52 2023 +0100 @@ -43,6 +43,8 @@ typ = get_type_of_struct(strct) fieldvars = [:($(name)::Union{$typ,Nothing} = nothing) for (name, typ) in typs] + fieldnames = [name for (name, _) in typs] + Mod = :ParallelProcessing method_map = Dict( Int64 => :take_num!, @@ -55,7 +57,7 @@ field_dispatch = [ quote if !matched && key == $(string(name)) - $name = $(method)(jp) + $name = $Mod.$(method)(jp) matched = true end end for (name, method) in methods @@ -65,83 +67,46 @@ $strct function ParallelProcessing.take_struct!( - ::Type{$(esc(typ))}, - jp::JP, + ::Type{$typ}, + jp::$(Mod).JP, )::Union{Nothing,$typ} - expect!(jp, '{') || return nothing + $Mod.expect!(jp, '{') || return nothing $(fieldvars...) while true - key = take_str!(jp) + key = $Mod.take_str!(jp) if isnothing(key) break end + $Mod.expect!(jp, ':') || error("malformed object - expected ':'") + matched = false $(field_dispatch...) if !matched - take_val!(jp) + $Mod.take_val!(jp) end - if expect!(jp, ',') + if $Mod.expect!(jp, ',') continue else break end end - if isnothing(level) || isnothing(kind) - error("Elements missing from object: $level, $kind") - end + #if $(fields_filled_cond...) + # error("Elements missing from object") + #end - expect!(jp, '}') || error("unclosed Details object") + $Mod.expect!(jp, '}') || error("unclosed object") - Details(level, kind) + $(typ)($(fieldnames...)) end - end + end |> esc end macro json_parseable(strct) json_parseable(strct) end - -function take_struct_!(::Type{Details}, jp::JP)::Union{Nothing,Details} - expect!(jp, '{') || return nothing - - level::Union{Nothing,String} = nothing - kind::Union{Nothing,Int} = nothing - while true - key = take_str!(jp) - if isnothing(key) - break - end - - expect!(jp, ':') || error("malformed object - expected ':'") - - # Custom code! - if key == "level" - level = take_str!(jp) - elseif key == "kind" - kind = take_num!(jp) - else - # Ignore unknown keys - take_val!(jp) - end - - if expect!(jp, ',') - continue - else - break - end - end - - if isnothing(level) || isnothing(kind) - error("Elements missing from object: $level, $kind") - end - - expect!(jp, '}') || error("unclosed Details object") - - Details(level, kind) -end