ice_rs/slice/
exception.rs1use 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 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}