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