@@ -90,3 +90,93 @@ 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 of definitions
127+   --        eg. of structs, enums, endocers and decoders
128+ 
129+ 
130+   compileFormat  :  Format ->  (Rust.Module ->  Maybe  Rust.Module)
131+   compileFormat f = 
132+     --  compile rep
133+     --  compile decode
134+     --  compile encode
135+     ? todo_compileFormat
136+ 
137+ 
138+   compileRep  :  (f  : Format) ->  Maybe  Rust.RType
139+   compileRep End  =  Just  (Rust . Tuple  [])
140+   compileRep Fail  =  Just  (Rust . Never )
141+   compileRep (Ignore  _  _ ) =  Just  (Rust . Tuple  [])
142+   compileRep (Repeat  _  f) = 
143+     Just  (Rust . Vec  ! (compileRep f)) --  TODO: Compile to a contract? Or maybe a
144+                                     --        fixed size array if the length is known
145+                                     --        or just throw away the info
146+   compileRep (Pure  x) = 
147+     ? todo_compileSingRep --  TODO: interpret an Idris type as a Rust type??
148+                          --        perhaps we need to restrict this?
149+   compileRep (Bind  f1 f2) = 
150+     Just  (Tuple 
151+       [ ! (compileRep f1)
152+       , ! (compileRep (f2 ? todo_compileBind_x))  --  TODO: how to bind the output?
153+                                                 --        enum based on the values of `x : Rep f1`?
154+                                                 --        depends on how `x` is used inside `f2`
155+       ])
156+   compileRep (Custom  f) = 
157+     --  TODO: f.RustRep
158+     Nothing 
159+ 
160+ 
161+   compileDecode  :  Format ->  (Rust.Module ->  Maybe  Rust.Module)
162+   compileDecode End  =  ? todo_compileDecodeEnd
163+   compileDecode Fail  =  ? todo_compileDecodeFail
164+   compileDecode (Pure  x) =  ? todo_compileDecodePure
165+   compileDecode (Ignore  f _ ) =  ? todo_compileDecodeIgnore
166+   compileDecode (Repeat  len f) =  ? todo_compileDecodeRepeat
167+   compileDecode (Bind  f1 f2) =  ? todo_compileDecodeBind
168+   compileDecode (Custom  f) = 
169+     --  TODO: f.rustDecode
170+     ? todo_compileDecodeCustom
171+ 
172+ 
173+   compileEncode  :  Format ->  (Rust.Module ->  Maybe  Rust.Module)
174+   compileEncode End  =  ? todo_compileEncodeEnd
175+   compileEncode Fail  =  ? todo_compileEncodeFail
176+   compileEncode (Pure  x) =  ? todo_compileEncodePure
177+   compileEncode (Ignore  f def) =  ? todo_compileEncodeIgnore
178+   compileEncode (Repeat  len f) =  ? todo_compileEncodeRepeat
179+   compileEncode (Bind  f1 f2) =  ? todo_compileEncodeBind
180+   compileEncode (Custom  f) = 
181+     --  TODO: f.rustEncode
182+     ? todo_compileEncodeCustom
0 commit comments