rsbind_core/java/ty/
vec_byte.rs1use proc_macro2::TokenStream;
2use rstgen::{Java, Tokens};
3
4use crate::ast::types::{AstBaseType, AstType};
5use crate::base::lang::{Convertible, Direction};
6use crate::java::types::JavaType;
7
8pub(crate) struct VecByte {
9 pub(crate) ty: AstType,
10}
11
12impl<'a> Convertible<Java<'a>> for VecByte {
13 fn native_to_transferable(
14 &self,
15 origin: String,
16 _direction: Direction,
17 ) -> Tokens<'static, Java<'a>> {
18 toks!(origin)
19 }
20
21 fn transferable_to_native(
22 &self,
23 origin: String,
24 _direction: Direction,
25 ) -> Tokens<'static, Java<'a>> {
26 toks!(origin)
27 }
28
29 fn rust_to_transferable(&self, origin: TokenStream, _direction: Direction) -> TokenStream {
30 match self.ty.clone() {
31 AstType::Vec(AstBaseType::Byte(ref base)) => {
32 if base.contains("i8") {
33 quote! {{
34 let slice = #origin.as_slice();
35 let converted = unsafe {
36 std::mem::transmute::<&[i8], &[u8]>(slice)
37 };
38 env.byte_array_from_slice(converted).unwrap()
39 }}
40 } else {
41 quote! {
42 env.byte_array_from_slice(&#origin).unwrap()
43 }
44 }
45 }
46 _ => {
47 quote! {}
48 }
49 }
50 }
51
52 fn transferable_to_rust(&self, origin: TokenStream, direction: Direction) -> TokenStream {
53 let buffer_get = match direction {
54 Direction::Down => {
55 quote! {}
56 }
57 Direction::Up => {
58 quote! {
59 let #origin = match #origin {
60 Ok(JValue::Object(value)) => {
61 value.into_inner() as jbyteArray
62 }
63 _ => panic!("Wrong vec byte type.")
64 };
65 }
66 }
67 };
68
69 match self.ty.clone() {
70 AstType::Vec(AstBaseType::Byte(ref base)) => {
71 if base.contains("i8") {
72 quote! {{
73 #buffer_get
74 let mut byte_array = env.convert_byte_array(#origin).unwrap();
75 let mut_ptr = byte_array.as_mut_ptr();
76 let len = byte_array.len();
77 let cap = byte_array.capacity();
78 unsafe {
79 std::mem::forget(byte_array);
80 Vec::from_raw_parts(mut_ptr as (* mut i8), len, cap)
81 }
82 }}
83 } else {
84 quote! {{
85 #buffer_get
86 env.convert_byte_array(#origin).unwrap()
87 }}
88 }
89 }
90 _ => {
91 quote! {}
92 }
93 }
94 }
95
96 fn native_type(&self) -> Java<'a> {
97 JavaType::new(AstType::Byte("i8".to_string())).to_array()
98 }
99
100 fn native_transferable_type(&self, _direction: Direction) -> Java<'a> {
101 JavaType::new(AstType::Byte("i8".to_string())).to_array()
102 }
103
104 fn rust_transferable_type(&self, _direction: Direction) -> TokenStream {
105 quote! {jbyteArray}
106 }
107
108 fn quote_common_in_bridge(&self) -> TokenStream {
109 quote! {}
110 }
111
112 fn quote_common_in_native(&self) -> Tokens<'static, Java<'a>> {
113 Tokens::new()
114 }
115
116 fn quote_in_common_rs(&self) -> TokenStream {
117 quote! {}
118 }
119}