@@ -90,3 +90,76 @@ namespace FormatOf
9090  simple_glyph =  FormatOf . do 
9191    flag <-  flag
9292    pure (flag. repeat  +  1 )
93+ 
94+ 
95+ --  Thinking about compilation
96+ 
97+ namespace Rust 
98+ 
99+   data  RType  :  Type  where 
100+     Var  :  String ->  RType
101+     U8  :  RType
102+     U16  :  RType
103+     U32  :  RType
104+     U64  :  RType
105+     I8  :  RType
106+     I16  :  RType
107+     I32  :  RType
108+     I64  :  RType
109+     Never  :  RType
110+     Tuple  :  List  RType ->  RType
111+     Vec  :  RType ->  RType
112+ 
113+   data  Item  :  Type  where 
114+     Struct  :  List  (String, RType) ->  Item
115+     Enum  :  List  (String, RType) ->  Item
116+     DecodeFn  :  ()  ->  Item
117+     EncodeFn  :  ()  ->  Item
118+ 
119+   record Module  where 
120+     constructor MkModule 
121+     items  :  List  (String, Item)
122+ 
123+ 
124+ namespace Compile 
125+ 
126+   --  TODO: Cache compilations
127+ 
128+   compileRep  :  (f  : Format) ->  Maybe  Rust.RType
129+   compileRep End  =  Just  (Rust . Tuple  [])
130+   compileRep Fail  =  Just  (Rust . Never )
131+   compileRep (Ignore  _  _ ) =  Just  (Rust . Tuple  [])
132+   compileRep (Repeat  _  f) =  Just  (Rust . Vec  ! (compileRep f))
133+   compileRep (Pure  x) = 
134+     ? todo_compileSingRep --  TODO: interpret an Idris type as a Rust type??
135+                          -- -      hm... maybe need to restrict this?
136+   compileRep (Bind  f1 f2) = 
137+     Just  (Tuple 
138+       [ ! (compileRep f1)
139+       , ! (compileRep (f2 ? todo_compileBind_x))  --  TODO: how to bind the output?
140+                                              --        enum based on the values of `x : Rep f1`?
141+                                              --        depends on how `x` is used inside `f2`
142+       ])
143+   compileRep (Custom  f) = 
144+     --  TODO: f.RustRep
145+     Nothing 
146+ 
147+ 
148+   compileDecode  :  Format ->  (Rust.Module ->  Maybe  Rust.Module)
149+   compileDecode End  =  ? todo_compileDecodeEnd
150+   compileDecode Fail  =  ? todo_compileDecodeFail
151+   compileDecode (Pure  x) =  ? todo_compileDecodePure
152+   compileDecode (Ignore  f _ ) =  ? todo_compileDecodeIgnore
153+   compileDecode (Repeat  len f) =  ? todo_compileDecodeRepeat
154+   compileDecode (Bind  f1 f2) =  ? todo_compileDecodeBind
155+   compileDecode (Custom  f) =  ? todo_compileDecodeCustom
156+ 
157+ 
158+   compileEncode  :  Format ->  (Rust.Module ->  Maybe  Rust.Module)
159+   compileEncode End  =  ? todo_compileEncodeEnd
160+   compileEncode Fail  =  ? todo_compileEncodeFail
161+   compileEncode (Pure  x) =  ? todo_compileEncodePure
162+   compileEncode (Ignore  f def) =  ? todo_compileEncodeIgnore
163+   compileEncode (Repeat  len f) =  ? todo_compileEncodeRepeat
164+   compileEncode (Bind  f1 f2) =  ? todo_compileEncodeBind
165+   compileEncode (Custom  f) =  ? todo_compileEncodeCustom
0 commit comments