ice_rs/slice/
function_return.rs

1use quote::{__private::TokenStream, format_ident, quote};
2
3use super::types::IceType;
4
5#[derive(Clone, Debug)]
6pub struct FunctionReturn {
7    pub r#type: IceType,
8    pub return_proxy: bool
9}
10
11impl FunctionReturn {
12    pub fn new(r#type: IceType) -> FunctionReturn {
13        FunctionReturn {
14            r#type: r#type,
15            return_proxy: false
16        }
17    }
18
19    pub fn empty() -> FunctionReturn {
20        FunctionReturn {
21            r#type: IceType::VoidType,
22            return_proxy: false
23        }
24    }
25
26    pub fn set_proxy(&mut self) {
27        self.return_proxy = true;
28    }
29
30    pub fn token(&self) -> TokenStream {
31        let token = self.r#type.token();
32        if self.return_proxy {
33            let typename = token.to_string();
34            let ident = format_ident!("{}{}", typename, if self.return_proxy { "Prx"} else {""});
35            quote! { #ident }
36        } else {
37            token
38        }
39    }
40
41    pub fn return_token(&self) -> TokenStream {
42        let return_token = self.token();
43        match &self.r#type {
44            IceType::VoidType => {
45                quote! {
46                    Ok(())
47                }
48            }
49            IceType::Optional(type_name, _) => {
50                let option_token = type_name.token();
51                quote! {
52                    Option::<#option_token>::from_bytes(&reply.body.data[read_bytes as usize..reply.body.data.len()], &mut read_bytes)
53                }
54            }
55            IceType::CustomType(_) => {
56                if self.return_proxy {
57                    quote! {
58                        let proxy_data = ProxyData::from_bytes(&reply.body.data[read_bytes as usize..reply.body.data.len()], &mut read_bytes)?;
59                        let proxy_string = format!("{}:{} -h {} -p {}", proxy_data.id, if proxy_data.secure { "ssl" } else { "tcp" }, self.proxy.host, self.proxy.port);
60                        let comm = ice_rs::communicator::Communicator::new();
61                        let proxy = comm.string_to_proxy(&proxy_string)?;
62                        #return_token::checked_cast(proxy)
63                    }
64                } else {
65                    quote! {
66                        #return_token::from_bytes(&reply.body.data[read_bytes as usize..reply.body.data.len()], &mut read_bytes)
67                    }
68                }
69            }
70            _ => {                
71                quote! {
72                    #return_token::from_bytes(&reply.body.data[read_bytes as usize..reply.body.data.len()], &mut read_bytes)
73                }
74            }
75        }
76    }
77}