ice_rs/slice/
exception.rs

1use crate::slice::types::IceType;
2use quote::{__private::TokenStream, quote};
3
4use super::struct_member::StructMember;
5
6
7#[derive(Clone, Debug)]
8pub struct Exception {
9    pub id: TokenStream,
10    pub ice_id: String,
11    pub members: Vec<StructMember>,
12    pub extends: Option<IceType>,
13}
14
15impl Exception {
16    pub fn empty() -> Exception {
17        Exception {
18            id: TokenStream::new(),
19            ice_id: String::new(),
20            members: Vec::new(),
21            extends: None
22        }
23    }
24
25    pub fn add_member(&mut self, member: StructMember) {
26        self.members.push(member);
27    }
28
29    // pub fn class_name(&self) -> String {
30    //     pascalcase::to_pascal_case(&self.name)
31    // }
32
33    pub fn generate(&self) -> Result<TokenStream, Box<dyn std::error::Error>> {
34        let id_token = &self.id;
35        let ice_id = &self.ice_id;
36        let mut member_tokens = self.members.iter().map(|member| {
37            member.declare()
38        }).collect::<Vec<_>>();
39        let member_to_bytes_tokens = self.members.iter().map(|member| {
40            member.to_bytes()
41        }).collect::<Vec<_>>();
42        let mut member_from_bytes_tokens = self.members.iter().map(|member| {
43            member.from_bytes()
44        }).collect::<Vec<_>>();
45
46        if self.extends.is_some() { 
47            let token = self.extends.as_ref().unwrap().token();
48            member_tokens.push(quote!{
49                extends: #token
50            });
51            member_from_bytes_tokens.push(quote!{
52                extends: #token::from_bytes(&bytes[read as usize..bytes.len()], &mut read)?
53            });
54        }
55
56        Ok(quote! {
57            #[derive(Debug)]
58            pub struct #id_token {
59                #(#member_tokens),*
60            }
61
62            impl std::fmt::Display for #id_token {
63                fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64                    write!(f, #ice_id)
65                }
66            }
67
68            impl std::error::Error for #id_token {}
69
70            impl ToBytes for #id_token {
71                fn to_bytes(&self) -> Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync>> {
72                    let mut bytes = Vec::new();
73                    #(#member_to_bytes_tokens);*;
74                    Ok(bytes)
75                }
76            }
77
78            impl FromBytes for #id_token {
79                fn from_bytes(bytes: &[u8], read_bytes: &mut i32) -> Result<Self, Box<dyn std::error::Error + Send + Sync>>
80                where Self: Sized {
81                    let mut read = 0;
82                    let _flag = SliceFlags::from_bytes(&bytes[read as usize..bytes.len()], &mut read)?;
83                    let _slice_name = String::from_bytes(&bytes[read as usize..bytes.len()], &mut read)?;
84                    let obj = Self {
85                        #(#member_from_bytes_tokens);*
86                    };
87                    *read_bytes = *read_bytes + read;
88                    Ok(obj)
89                }
90            }
91        })
92    }
93}