1+ mod r#const;
12mod r#enum;
23mod r#fn;
34mod index;
@@ -10,6 +11,7 @@ use super::*;
1011use index:: * ;
1112use interface:: * ;
1213use param:: * ;
14+ use r#const:: * ;
1315use r#enum:: * ;
1416use r#fn:: * ;
1517use r#struct:: * ;
@@ -288,6 +290,7 @@ fn encode_item(
288290 syntax:: Item :: Interface ( ty) => encode_interface ( encoder, ty) ,
289291 syntax:: Item :: Union ( ty) => encode_union ( encoder, ty) ,
290292 syntax:: Item :: Fn ( ty) => encode_fn ( encoder, ty) ,
293+ syntax:: Item :: Const ( ty) => encode_const ( encoder, ty) ,
291294 rest => todo ! ( "{rest:?}" ) ,
292295 }
293296}
@@ -301,6 +304,70 @@ fn encode_type(encoder: &Encoder, ty: &syn::Type) -> Result<metadata::Type, Erro
301304 }
302305}
303306
307+ fn encode_value (
308+ encoder : & Encoder ,
309+ ty : & metadata:: Type ,
310+ value : & syn:: Expr ,
311+ ) -> Result < metadata:: Value , Error > {
312+ let value = match ty {
313+ metadata:: Type :: I8 => metadata:: Value :: I8 ( encode_neg_lit_int :: < i8 > ( encoder, value) ?) ,
314+ metadata:: Type :: U8 => metadata:: Value :: U8 ( encode_lit_int :: < u8 > ( encoder, value) ?) ,
315+ metadata:: Type :: I16 => metadata:: Value :: I16 ( encode_neg_lit_int :: < i16 > ( encoder, value) ?) ,
316+ metadata:: Type :: U16 => metadata:: Value :: U16 ( encode_lit_int :: < u16 > ( encoder, value) ?) ,
317+ metadata:: Type :: I32 => metadata:: Value :: I32 ( encode_neg_lit_int :: < i32 > ( encoder, value) ?) ,
318+ metadata:: Type :: U32 => metadata:: Value :: U32 ( encode_lit_int :: < u32 > ( encoder, value) ?) ,
319+ metadata:: Type :: I64 => metadata:: Value :: I64 ( encode_neg_lit_int :: < i64 > ( encoder, value) ?) ,
320+ metadata:: Type :: U64 => metadata:: Value :: U64 ( encode_lit_int :: < u64 > ( encoder, value) ?) ,
321+ rest => todo ! ( "{rest:?}" ) ,
322+ } ;
323+
324+ Ok ( value)
325+ }
326+
327+ fn encode_neg_lit_int < T > ( encoder : & Encoder , expr : & syn:: Expr ) -> Result < T , Error >
328+ where
329+ T : std:: str:: FromStr + std:: ops:: Neg < Output = T > ,
330+ T :: Err : std:: fmt:: Display ,
331+ {
332+ let value = match expr {
333+ syn:: Expr :: Lit ( syn:: ExprLit {
334+ lit : syn:: Lit :: Int ( int) ,
335+ ..
336+ } ) => int. base10_parse ( ) . ok ( ) ,
337+ syn:: Expr :: Unary ( syn:: ExprUnary {
338+ op : syn:: UnOp :: Neg ( _) ,
339+ expr,
340+ ..
341+ } ) => match expr. as_ref ( ) {
342+ syn:: Expr :: Lit ( syn:: ExprLit {
343+ lit : syn:: Lit :: Int ( int) ,
344+ ..
345+ } ) => int. base10_parse ( ) . ok ( ) . map ( |value : T | -value) ,
346+ _ => None ,
347+ } ,
348+ _ => None ,
349+ } ;
350+
351+ value. ok_or_else ( || encoder. error ( expr, "value not valid" ) )
352+ }
353+
354+ fn encode_lit_int < T > ( encoder : & Encoder , expr : & syn:: Expr ) -> Result < T , Error >
355+ where
356+ T : std:: str:: FromStr ,
357+ T :: Err : std:: fmt:: Display ,
358+ {
359+ let value = match expr {
360+ syn:: Expr :: Lit ( syn:: ExprLit {
361+ lit : syn:: Lit :: Int ( int) ,
362+ ..
363+ } ) => int. base10_parse ( ) . ok ( ) ,
364+
365+ _ => None ,
366+ } ;
367+
368+ value. ok_or_else ( || encoder. error ( expr, "value not valid" ) )
369+ }
370+
304371fn encode_type_reference (
305372 encoder : & Encoder ,
306373 ty : & syn:: TypeReference ,
0 commit comments