Skip to content

Commit 564591a

Browse files
committed
added to readme and test coverage
1 parent a390f04 commit 564591a

File tree

4 files changed

+73
-641
lines changed

4 files changed

+73
-641
lines changed

README.md

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,24 +59,26 @@ Available property types: `i32`, `f64`, `bool`, `String`
5959
- `name_ru` - property name in 1C in Russian
6060
### Input arguments, `#[arg(ty = ...)]`, for each type of argument must be set, on of:
6161
| Type definition | Rust type | 1C type |
62-
|-----------------|-------------------------|-------------------------|
62+
| --------------- | ----------------------- | ----------------------- |
6363
| `Int` | `i32` | `Number` (Int) |
6464
| `Float` | `f64` | `Number` (Float or Int) |
6565
| `Bool` | `bool` | `Boolean` |
6666
| `Str` | `String` | `String` |
6767
| `Date` | `chrono::NaiveDateTime` | `Date` |
6868
| `Blob` | `Vec<u8>` | `BinaryData` |
69+
| `Any` | `ParamValue` | `Any` |
6970

7071
### Return values, `#[returns(ty = ...)]`, type must be set, one of:
7172
| Type definition | Rust type | 1C type |
72-
|-----------------|-------------------------|--------------|
73+
| --------------- | ----------------------- | ------------ |
7374
| `Int` | `i32` | `Number` |
7475
| `Float` | `f64` | `Number` |
7576
| `Bool` | `bool` | `Boolean` |
7677
| `Str` | `String` | `String` |
7778
| `Date` | `chrono::NaiveDateTime` | `Date` |
7879
| `Blob` | `Vec<u8>` | `BinaryData` |
7980
| `None` | `()` | `Undefined` |
81+
| `Any` | `ParamValue` | `Any` |
8082

8183
Additionally, `Result<T, ()>` can be used, where `T` is one of the above. In this case, `result`
8284
must be set in `#[returns(...)]` attribute: `#[returns(Int, result)]` for `Result<i32, ()>`
@@ -103,7 +105,7 @@ native_api_1c = "0.10.5"
103105
use std::sync::Arc;
104106

105107
use native_api_1c::{
106-
native_api_1c_core::ffi::connection::Connection,
108+
native_api_1c_core::{ffi::connection::Connection, interface::ParamValue},
107109
native_api_1c_macro::{extern_functions, AddIn},
108110
};
109111

@@ -139,6 +141,13 @@ pub struct SampleAddIn {
139141
#[add_in_func(name = "MyProcedure", name_ru = "МояПроцедура")]
140142
pub my_procedure: fn(&mut Self),
141143

144+
/// Function that accepts Any types
145+
#[add_in_func(name = "CompareAny", name_ru = "СравнитьЛюбое")]
146+
#[arg(ty = Any)]
147+
#[arg(ty = Any)]
148+
#[returns(ty = Bool)]
149+
pub compare_any: fn(ParamValue, ParamValue) -> bool,
150+
142151
/// Private field, not visible from 1C
143152
private_field: i32,
144153
}
@@ -152,6 +161,7 @@ impl Default for SampleAddIn {
152161
my_function: Self::my_function_inner,
153162
my_procedure: Self::my_procedure_inner,
154163
private_field: 100,
164+
compare_any: Self::compare_any,
155165
}
156166
}
157167
}
@@ -168,6 +178,10 @@ impl SampleAddIn {
168178
fn my_procedure_inner(&mut self) {
169179
self.protected_prop += 10;
170180
}
181+
182+
fn compare_any(arg1: ParamValue, arg2: ParamValue) -> bool {
183+
arg1 == arg2
184+
}
171185
}
172186

173187
extern_functions! {

native_api_1c_macro/src/derive_addin/utils.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,24 @@ pub fn expr_to_os_value(
5050
ty: &ParamType,
5151
string_nil: bool,
5252
) -> proc_macro2::TokenStream {
53-
let os_string_fn = if string_nil {
54-
quote! {native_api_1c::native_api_1c_core::ffi::string_utils::os_string_nil}
55-
} else {
56-
quote! {native_api_1c::native_api_1c_core::ffi::string_utils::os_string}
57-
};
5853
match ty {
59-
ParamType::String => quote! {
54+
ParamType::String => {
55+
let os_string_fn = if string_nil {
56+
quote! {native_api_1c::native_api_1c_core::ffi::string_utils::os_string_nil}
57+
} else {
58+
quote! {native_api_1c::native_api_1c_core::ffi::string_utils::os_string}
59+
};
60+
quote! {
61+
{
62+
let _ = "expr_to_os_value: specific case for String";
63+
#ty(#os_string_fn(&#expr.clone()).clone().into())
64+
}
65+
}
66+
}
67+
ParamType::Any => quote! {
6068
{
61-
let _ = "expr_to_os_value: specific case for String";
62-
#ty(#os_string_fn(&#expr.clone()).clone().into())
69+
let _ = "expr_to_os_value: specific case for Any";
70+
#expr.clone()
6371
}
6472
},
6573
_ => quote! {

native_api_1c_macro/tests/interface/functions.rs

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ const PROCEDURE_NAME_RU: &str = "Процедура";
2222
const OUT_FUNCTION_NAME_EN: &str = "OutFunction";
2323
const OUT_FUNCTION_NAME_RU: &str = "ВыводФункция";
2424

25+
const ANY_ARG_NAME_EN: &str = "AnyArg";
26+
const ANY_ARG_NAME_RU: &str = "ЛюбойАргумент";
27+
2528
const INVALID_NAME: &str = "Invalid";
2629

2730
#[derive(AddIn)]
28-
struct TestAddIn {
31+
struct TestAddInFixture {
2932
#[add_in_con]
3033
connection: Arc<Option<&'static Connection>>,
3134

@@ -45,11 +48,16 @@ struct TestAddIn {
4548
#[add_in_func(name = OUT_FUNCTION_NAME_EN, name_ru = OUT_FUNCTION_NAME_RU)]
4649
#[arg(ty = Str, as_out, default = OUT_STR)]
4750
pub out_function: fn(&mut String),
51+
52+
#[add_in_func(name = ANY_ARG_NAME_EN, name_ru = ANY_ARG_NAME_RU)]
53+
#[arg(ty = Any)]
54+
#[returns(ty = Any)]
55+
pub any_arg_func: fn(&Self, ParamValue) -> ParamValue,
4856
}
4957

5058
#[fixture]
51-
fn add_in() -> TestAddIn {
52-
TestAddIn {
59+
fn add_in() -> TestAddInFixture {
60+
TestAddInFixture {
5361
connection: Arc::new(None),
5462
storage: 0,
5563
function: |addin, a, b| Ok(a + b + addin.storage),
@@ -59,12 +67,13 @@ fn add_in() -> TestAddIn {
5967
out_function: |out_str| {
6068
*out_str = format!("Hello, {out_str}!");
6169
},
70+
any_arg_func: |_, arg| arg,
6271
}
6372
}
6473

6574
#[rstest]
66-
fn test_get_n_methods(add_in: TestAddIn) {
67-
assert_eq!(add_in.get_n_methods(), 3)
75+
fn test_get_n_methods(add_in: TestAddInFixture) {
76+
assert_eq!(add_in.get_n_methods(), 4)
6877
}
6978

7079
#[rstest]
@@ -75,7 +84,7 @@ fn test_get_n_methods(add_in: TestAddIn) {
7584
#[case(OUT_FUNCTION_NAME_EN, Some(2))]
7685
#[case(OUT_FUNCTION_NAME_RU, Some(2))]
7786
#[case(INVALID_NAME, None)]
78-
fn test_find_method(add_in: TestAddIn, #[case] name: &str, #[case] expected: Option<usize>) {
87+
fn test_find_method(add_in: TestAddInFixture, #[case] name: &str, #[case] expected: Option<usize>) {
7988
use native_api_1c::native_api_1c_core::ffi::string_utils::os_string_nil;
8089

8190
assert_eq!(add_in.find_method(&os_string_nil(name)), expected);
@@ -91,9 +100,9 @@ fn test_find_method(add_in: TestAddIn, #[case] name: &str, #[case] expected: Opt
91100
#[case(2, 0, Some(OUT_FUNCTION_NAME_EN))]
92101
#[case(2, 1, Some(OUT_FUNCTION_NAME_RU))]
93102
#[case(2, 42, Some(OUT_FUNCTION_NAME_RU))]
94-
#[case(3, 0, None)]
103+
#[case(42, 0, None)]
95104
fn test_get_method_name(
96-
add_in: TestAddIn,
105+
add_in: TestAddInFixture,
97106
#[case] method_i: usize,
98107
#[case] alias_i: usize,
99108
#[case] expected: Option<&str>,
@@ -110,8 +119,9 @@ fn test_get_method_name(
110119
#[case(0, 2)]
111120
#[case(1, 2)]
112121
#[case(2, 1)]
113-
#[case(3, 0)]
114-
fn test_get_n_params(add_in: TestAddIn, #[case] method_i: usize, #[case] n_params: usize) {
122+
#[case(3, 1)]
123+
#[case(42, 0)]
124+
fn test_get_n_params(add_in: TestAddInFixture, #[case] method_i: usize, #[case] n_params: usize) {
115125
assert_eq!(add_in.get_n_params(method_i), n_params);
116126
}
117127

@@ -126,7 +136,7 @@ fn test_get_n_params(add_in: TestAddIn, #[case] method_i: usize, #[case] n_param
126136
#[case(2, 42, None)]
127137
#[case(3, 0, None)]
128138
fn test_get_param_def_value(
129-
add_in: TestAddIn,
139+
add_in: TestAddInFixture,
130140
#[case] method_i: usize,
131141
#[case] param_i: usize,
132142
#[case] expected: Option<ParamValue>,
@@ -138,13 +148,14 @@ fn test_get_param_def_value(
138148
#[case(0, true)]
139149
#[case(1, false)]
140150
#[case(2, false)]
141-
#[case(3, false)]
142-
fn test_has_ret_val(add_in: TestAddIn, #[case] method_i: usize, #[case] has_ret_val: bool) {
151+
#[case(3, true)]
152+
#[case(42, false)]
153+
fn test_has_ret_val(add_in: TestAddInFixture, #[case] method_i: usize, #[case] has_ret_val: bool) {
143154
assert_eq!(add_in.has_ret_val(method_i), has_ret_val);
144155
}
145156

146157
#[rstest]
147-
fn test_call_function(mut add_in: TestAddIn) {
158+
fn test_call_function(mut add_in: TestAddInFixture) {
148159
let a = ParamValue::I32(1);
149160
let b = ParamValue::I32(2);
150161
let mut params = ParamValues::new(vec![a, b]);
@@ -158,7 +169,7 @@ fn test_call_function(mut add_in: TestAddIn) {
158169
}
159170

160171
#[rstest]
161-
fn test_call_procedure(mut add_in: TestAddIn) {
172+
fn test_call_procedure(mut add_in: TestAddInFixture) {
162173
let a = ParamValue::I32(1);
163174
let b = ParamValue::I32(2);
164175
let mut params = ParamValues::new(vec![a, b]);
@@ -172,7 +183,7 @@ fn test_call_procedure(mut add_in: TestAddIn) {
172183
}
173184

174185
#[rstest]
175-
fn test_call_out_function(mut add_in: TestAddIn) {
186+
fn test_call_out_function(mut add_in: TestAddInFixture) {
176187
let out_str = os_string("1C");
177188
let mut params = ParamValues::new(vec![ParamValue::String(out_str)]);
178189

@@ -183,3 +194,16 @@ fn test_call_out_function(mut add_in: TestAddIn) {
183194
assert!(result.is_ok());
184195
assert_eq!(params[0], ParamValue::String(os_string("Hello, 1C!")));
185196
}
197+
198+
#[rstest]
199+
#[case(ParamValue::I32(42))]
200+
#[case(ParamValue::String(os_string("Test")))]
201+
#[case(ParamValue::Bool(true))]
202+
fn test_call_any_arg_function(mut add_in: TestAddInFixture, #[case] value: ParamValue) {
203+
let params = ParamValues::new(vec![value.clone()]);
204+
let func = add_in.find_method(&os_string(ANY_ARG_NAME_EN)).unwrap();
205+
206+
let result = add_in.call_as_func(func, &mut params.clone());
207+
assert!(result.is_ok());
208+
assert_eq!(result.unwrap(), value);
209+
}

0 commit comments

Comments
 (0)