|
1 | 1 | mod allocator; |
2 | 2 |
|
3 | | -use std::{collections::HashMap, convert::TryFrom}; |
| 3 | +use std::{collections::HashMap, convert::TryFrom, mem::MaybeUninit}; |
4 | 4 |
|
5 | 5 | use allocator::PhpAllocator; |
6 | 6 | use ext_php_rs::{ |
7 | 7 | call_user_func, info_table_end, info_table_row, info_table_start, |
8 | 8 | php::{ |
| 9 | + class::ClassEntry, |
9 | 10 | exceptions::PhpException, |
10 | 11 | module::ModuleEntry, |
11 | 12 | types::{array::ZendHashTable, callable::Callable, zval::Zval}, |
12 | 13 | }, |
| 14 | + php_class, |
13 | 15 | prelude::*, |
14 | 16 | }; |
15 | 17 |
|
16 | 18 | #[global_allocator] |
17 | 19 | static GLOBAL: PhpAllocator = PhpAllocator::new(); |
18 | 20 |
|
19 | | -#[php_function] |
20 | | -pub fn hello_world() -> String { |
21 | | - let call = Callable::try_from_name("strpos").unwrap(); |
22 | | - |
23 | | - eprintln!("im callin"); |
24 | | - let val = call.try_call(vec![&"hello world", &"w"]); |
25 | | - dbg!(val); |
26 | | - "Ok".into() |
27 | | -} |
28 | | - |
29 | | -#[derive(Debug, Default, ZendObjectHandler)] |
30 | | -struct Human { |
31 | | - name: String, |
32 | | - age: i32, |
33 | | -} |
34 | | - |
35 | | -#[php_impl] |
36 | | -impl Human { |
37 | | - const AGE_LIMIT: i32 = 100; |
38 | | - |
39 | | - #[optional(age)] |
40 | | - #[defaults(age = 10)] |
41 | | - pub fn __construct(&mut self, name: String, age: i32) { |
42 | | - self.name = name; |
43 | | - self.age = age; |
44 | | - } |
45 | | - |
46 | | - pub fn get_name(&self) -> String { |
47 | | - self.name.to_string() |
48 | | - } |
49 | | - |
50 | | - pub fn get_age(&self) -> i32 { |
51 | | - self.age |
52 | | - } |
53 | | - |
54 | | - pub fn get_age_limit() -> i32 { |
55 | | - Self::AGE_LIMIT |
56 | | - } |
57 | | -} |
58 | | - |
59 | | -#[derive(Debug, ZendObjectHandler)] |
60 | | -struct Test { |
61 | | - a: u32, |
62 | | - b: u32, |
63 | | -} |
64 | | - |
65 | | -#[php_impl] |
66 | | -impl Test { |
67 | | - const TEST: &'static str = "Hello, world!"; |
68 | | - |
69 | | - pub fn __construct(&self) { |
70 | | - dbg!(self); |
71 | | - println!("Inside constructor"); |
72 | | - } |
73 | | - |
74 | | - pub fn set(&mut self, a: u32) { |
75 | | - self.a = a; |
76 | | - dbg!(self.get()); |
77 | | - } |
78 | | - |
79 | | - pub fn get(&self) -> u32 { |
80 | | - self.a |
81 | | - } |
82 | | - |
83 | | - pub fn call(&self, func: Callable) { |
84 | | - let result = call_user_func!(func); |
85 | | - |
86 | | - if let Ok(r) = result { |
87 | | - dbg!(r); |
88 | | - } |
89 | | - |
90 | | - println!("Ready for call!"); |
91 | | - } |
92 | | -} |
93 | | - |
94 | | -impl Default for Test { |
95 | | - fn default() -> Self { |
96 | | - Self { a: 1, b: 2 } |
97 | | - } |
98 | | -} |
99 | | - |
100 | | -#[php_const] |
101 | | -const SKEL_TEST_CONST: &str = "Test constant"; |
102 | | -#[php_const] |
103 | | -const SKEL_TEST_LONG_CONST: i32 = 1234; |
104 | | - |
105 | | -#[php_function(optional = "z")] |
106 | | -pub fn skeleton_version(x: ZendHashTable, y: f64, z: Option<f64>) -> String { |
107 | | - dbg!(x, y, z); |
108 | | - "Hello".into() |
109 | | -} |
110 | | - |
111 | | -#[php_function(optional = "z")] |
112 | | -pub fn skeleton_array( |
113 | | - arr: ZendHashTable, |
114 | | - x: i32, |
115 | | - y: f64, |
116 | | - z: Option<f64>, |
117 | | -) -> Result<ZendHashTable, String> { |
118 | | - for (k, x, y) in arr.iter() { |
119 | | - println!("{:?} {:?} {:?}", k, x, y.string()); |
120 | | - } |
121 | | - |
122 | | - dbg!(x, y, z); |
123 | | - |
124 | | - let mut new = ZendHashTable::new(); |
125 | | - new.insert("Hello", &"World") |
126 | | - .map_err(|_| "Couldn't insert into hashtable")?; |
127 | | - Ok(new) |
128 | | -} |
129 | | - |
130 | | -#[php_function(optional = "i", defaults(i = 5))] |
131 | | -pub fn test_array(i: i32, b: Option<i32>) -> Vec<i32> { |
132 | | - dbg!(i, b); |
133 | | - vec![1, 2, 3, 4] |
134 | | -} |
135 | | - |
136 | | -#[php_function(optional = "offset", defaults(offset = 0))] |
137 | | -pub fn rust_strpos(haystack: &str, needle: &str, offset: i64) -> Option<usize> { |
138 | | - let haystack = haystack.chars().skip(offset as usize).collect::<String>(); |
139 | | - haystack.find(needle) |
140 | | -} |
141 | | - |
142 | | -#[php_function] |
143 | | -pub fn example_exception() -> Result<i32, &'static str> { |
144 | | - Err("Bad here") |
145 | | -} |
| 21 | +// #[php_function] |
| 22 | +// pub fn hello_world() -> String { |
| 23 | +// let call = Callable::try_from_name("strpos").unwrap(); |
| 24 | + |
| 25 | +// eprintln!("im callin"); |
| 26 | +// let val = call.try_call(vec![&"hello world", &"w"]); |
| 27 | +// dbg!(val); |
| 28 | +// "Ok".into() |
| 29 | +// } |
| 30 | + |
| 31 | +// #[php_const] |
| 32 | +// const SKEL_TEST_CONST: &str = "Test constant"; |
| 33 | +// #[php_const] |
| 34 | +// const SKEL_TEST_LONG_CONST: i32 = 1234; |
| 35 | + |
| 36 | +// #[php_function(optional = "z")] |
| 37 | +// pub fn skeleton_version(x: ZendHashTable, y: f64, z: Option<f64>) -> String { |
| 38 | +// dbg!(x, y, z); |
| 39 | +// "Hello".into() |
| 40 | +// } |
| 41 | + |
| 42 | +// #[php_function(optional = "z")] |
| 43 | +// pub fn skeleton_array( |
| 44 | +// arr: ZendHashTable, |
| 45 | +// x: i32, |
| 46 | +// y: f64, |
| 47 | +// z: Option<f64>, |
| 48 | +// ) -> Result<ZendHashTable, String> { |
| 49 | +// for (k, x, y) in arr.iter() { |
| 50 | +// println!("{:?} {:?} {:?}", k, x, y.string()); |
| 51 | +// } |
| 52 | + |
| 53 | +// dbg!(x, y, z); |
| 54 | + |
| 55 | +// let mut new = ZendHashTable::new(); |
| 56 | +// new.insert("Hello", &"World") |
| 57 | +// .map_err(|_| "Couldn't insert into hashtable")?; |
| 58 | +// Ok(new) |
| 59 | +// } |
| 60 | + |
| 61 | +// #[php_function(optional = "i", defaults(i = 5))] |
| 62 | +// pub fn test_array(i: i32, b: Option<i32>) -> Vec<i32> { |
| 63 | +// dbg!(i, b); |
| 64 | +// vec![1, 2, 3, 4] |
| 65 | +// } |
| 66 | + |
| 67 | +// #[php_function(optional = "offset", defaults(offset = 0))] |
| 68 | +// pub fn rust_strpos(haystack: &str, needle: &str, offset: i64) -> Option<usize> { |
| 69 | +// let haystack = haystack.chars().skip(offset as usize).collect::<String>(); |
| 70 | +// haystack.find(needle) |
| 71 | +// } |
| 72 | + |
| 73 | +// #[php_function] |
| 74 | +// pub fn example_exception() -> Result<i32, &'static str> { |
| 75 | +// Err("Bad here") |
| 76 | +// } |
| 77 | + |
| 78 | +// #[php_function] |
| 79 | +// pub fn skel_unpack<'a>( |
| 80 | +// mut arr: HashMap<String, String>, |
| 81 | +// ) -> Result<HashMap<String, String>, PhpException<'a>> { |
| 82 | +// arr.insert("hello".into(), "not world".into()); |
| 83 | +// Ok(arr) |
| 84 | +// } |
| 85 | + |
| 86 | +// #[php_function] |
| 87 | +// pub fn test_extern() -> i32 { |
| 88 | +// // let y = unsafe { strpos("hello", "e", None) }; |
| 89 | +// // dbg!(y); |
| 90 | +// // let x = unsafe { test_func() }; |
| 91 | +// // dbg!(x.try_call(vec![])); |
| 92 | +// 0 |
| 93 | +// } |
| 94 | + |
| 95 | +// #[php_function] |
| 96 | +// pub fn test_lifetimes<'a>() -> ZendHashTable<'a> { |
| 97 | +// ZendHashTable::try_from(&HashMap::<String, String>::new()).unwrap() |
| 98 | +// } |
146 | 99 |
|
147 | 100 | #[php_function] |
148 | | -pub fn skel_unpack<'a>( |
149 | | - mut arr: HashMap<String, String>, |
150 | | -) -> Result<HashMap<String, String>, PhpException<'a>> { |
151 | | - arr.insert("hello".into(), "not world".into()); |
152 | | - Ok(arr) |
| 101 | +pub fn test_str(input: &str) -> &str { |
| 102 | + input |
153 | 103 | } |
154 | 104 |
|
155 | | -#[php_function] |
156 | | -pub fn test_extern() -> i32 { |
157 | | - let y = unsafe { strpos("hello", "e", None) }; |
158 | | - dbg!(y); |
159 | | - // let x = unsafe { test_func() }; |
160 | | - // dbg!(x.try_call(vec![])); |
161 | | - 0 |
162 | | -} |
| 105 | +// #[no_mangle] |
| 106 | +// pub extern "C" fn php_module_info(_module: *mut ModuleEntry) { |
| 107 | +// info_table_start!(); |
| 108 | +// info_table_row!("skeleton extension", "enabled"); |
| 109 | +// info_table_end!(); |
| 110 | +// } |
163 | 111 |
|
164 | | -#[php_function] |
165 | | -pub fn test_lifetimes<'a>() -> ZendHashTable<'a> { |
166 | | - ZendHashTable::try_from(&HashMap::<String, String>::new()).unwrap() |
167 | | -} |
| 112 | +#[php_class(name = "Redis\\Exception\\RedisClientException")] |
| 113 | +#[extends(ClassEntry::exception())] |
| 114 | +#[derive(Default)] |
| 115 | +struct RedisException; |
168 | 116 |
|
169 | 117 | #[php_function] |
170 | | -pub fn test_str(input: &str) -> &str { |
171 | | - input |
172 | | -} |
173 | | - |
174 | | -#[no_mangle] |
175 | | -pub extern "C" fn php_module_info(_module: *mut ModuleEntry) { |
176 | | - info_table_start!(); |
177 | | - info_table_row!("skeleton extension", "enabled"); |
178 | | - info_table_end!(); |
| 118 | +pub fn test_exception() -> Result<i32, PhpException<'static>> { |
| 119 | + Err(PhpException::from_class::<RedisException>( |
| 120 | + "Hello world".into(), |
| 121 | + )) |
179 | 122 | } |
180 | 123 |
|
181 | | -#[php_startup] |
182 | | -pub fn startup() {} |
183 | | - |
184 | 124 | #[php_module] |
185 | 125 | pub fn module(module: ModuleBuilder) -> ModuleBuilder { |
186 | | - module.info_function(php_module_info) |
187 | | -} |
188 | | - |
189 | | -#[php_extern] |
190 | | -extern "C" { |
191 | | - fn test_func<'a>() -> Callable<'a>; |
192 | | - fn strpos2(haystack: &str, needle: &str, offset: Option<i32>) -> Zval; |
193 | | - pub fn strpos(haystack: &str, needle: &str, offset: Option<i32>) -> Zval; |
| 126 | + // module.info_function(php_module_info) |
| 127 | + module |
194 | 128 | } |
0 commit comments