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