@@ -90,3 +90,93 @@ namespace FormatOf
90
90
simple_glyph = FormatOf . do
91
91
flag <- flag
92
92
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