diff --git a/README.md b/README.md index 86b0e5c..3a47b6d 100644 --- a/README.md +++ b/README.md @@ -7,26 +7,55 @@ Пример реализации простой компоненты: +```toml +# Cargo.toml +[package] +name = "my_addin" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +utf16_lit = "2.0" +native_api_1c = "0.10.1" +``` + ```rust -// lib.rs +// src/lib.rs use std::sync::Arc; -use native_api_1c::{ - native_api_1c_core::{self, ffi::connection::Connection}, - native_api_1c_macro::AddIn, -}; +use native_api_1c::{native_api_1c_core::ffi::connection::Connection, native_api_1c_macro::AddIn}; #[derive(AddIn)] pub struct MyAddIn { + // соедиенение с 1С для вызова внешних событий #[add_in_con] connection: Arc>, // Arc для возможности многопоточности + // свойство, доступное для чтения и записи #[add_in_prop(name = "MyProp", name_ru = "МоеСвойство", readable, writable)] pub some_prop: i32, + + // свойство, доступное только для чтения #[add_in_prop(name = "ProtectedProp", name_ru = "ЗащищенноеСвойство", readable)] pub protected_prop: i32, + + // функция, принимающая один или два аргумента и возвращающая результат + // в 1С можно вызвать как: + // ОбъектКомпоненты.МояФункция(10, 15); // 2й аргумент = 15 + // ОбъектКомпоненты.МояФункция(10); // 2й аргумент = 12 (значение по умолчанию) + // Если функция возвращает ошибку, но не паника, то в 1С будет вызвано исключение #[add_in_func(name = "MyFunction", name_ru = "МояФункция")] - pub my_function: fn(&Self, i32) -> i32, + #[arg(Int)] + #[arg(Int, default = 12)] + #[returns(Int, result)] + pub my_function: fn(&Self, i32, i64) -> Result, + + // Процедура, ничего не получающая, ничего не возвращающая + #[add_in_func(name = "MyProcedure", name_ru = "МояПроцедура")] + pub my_procedure: fn(&mut Self), private_field: i32, } @@ -38,12 +67,21 @@ impl MyAddIn { some_prop: 0, protected_prop: 50, my_function: Self::my_function, + my_procedure: Self::my_procedure, private_field: 100, } } - fn my_function(&self, arg: i32) -> i32 { - self.protected_prop + self.some_prop + arg + self.private_field + fn my_function(&self, arg: i32, arg_maybe_default: i64) -> Result { + Ok(self.protected_prop + + self.some_prop + + arg + + self.private_field + + arg_maybe_default as i32) + } + + fn my_procedure(&mut self) { + self.protected_prop += 1; } } ``` \ No newline at end of file diff --git a/native_api_1c_macro b/native_api_1c_macro index e84ce2c..7609711 160000 --- a/native_api_1c_macro +++ b/native_api_1c_macro @@ -1 +1 @@ -Subproject commit e84ce2cdc5bb0601c00678ed6300d7283d85668e +Subproject commit 7609711f02fd534092b8fa547478d931d812d421 diff --git a/sample_addin_rs/Cargo.toml b/sample_addin_rs/Cargo.toml index e8937de..5de79b5 100644 --- a/sample_addin_rs/Cargo.toml +++ b/sample_addin_rs/Cargo.toml @@ -8,7 +8,7 @@ crate-type = ["cdylib"] [dependencies] utf16_lit = "2.0" -native_api_1c = "0.9.3" +native_api_1c = "0.10.1" [workspace] diff --git a/sample_addin_rs/src/lib.rs b/sample_addin_rs/src/lib.rs index a402c30..0564ad9 100644 --- a/sample_addin_rs/src/lib.rs +++ b/sample_addin_rs/src/lib.rs @@ -1,21 +1,35 @@ use std::sync::Arc; -use native_api_1c::native_api_1c_core::ffi::connection::Connection; -use native_api_1c::native_api_1c_macro::AddIn; +use native_api_1c::{native_api_1c_core::ffi::connection::Connection, native_api_1c_macro::AddIn}; #[derive(AddIn)] pub struct MyAddIn { + // соедиенение с 1С для вызова внешних событий #[add_in_con] - connection: Arc>, + connection: Arc>, // Arc для возможности многопоточности + // свойство, доступное для чтения и записи #[add_in_prop(name = "MyProp", name_ru = "МоеСвойство", readable, writable)] pub some_prop: i32, + + // свойство, доступное только для чтения #[add_in_prop(name = "ProtectedProp", name_ru = "ЗащищенноеСвойство", readable)] pub protected_prop: i32, + + // функция, принимающая один или два аргумента и возвращающая результат + // в 1С можно вызвать как: + // ОбъектКомпоненты.МояФункция(10, 15); // 2й аргумент = 15 + // ОбъектКомпоненты.МояФункция(10); // 2й аргумент = 12 (значение по умолчанию) + // Если функция возвращает ошибку, но не паника, то в 1С будет вызвано исключение #[add_in_func(name = "MyFunction", name_ru = "МояФункция")] - pub my_function: fn(&Self, i32) -> i32, - #[add_in_func(name = "SumOfTwo", name_ru = "СуммаДвух")] - pub sum_of_2: fn(&Self, i32, i32) -> String, + #[arg(Int)] + #[arg(Int, default = 12)] + #[returns(Int, result)] + pub my_function: fn(&Self, i32, i64) -> Result, + + // Процедура, ничего не получающая, ничего не возвращающая + #[add_in_func(name = "MyProcedure", name_ru = "МояПроцедура")] + pub my_procedure: fn(&mut Self), private_field: i32, } @@ -27,16 +41,20 @@ impl MyAddIn { some_prop: 0, protected_prop: 50, my_function: Self::my_function, - sum_of_2: Self::sum_of_2, + my_procedure: Self::my_procedure, private_field: 100, } } - fn my_function(&self, arg: i32) -> i32 { - self.protected_prop + self.some_prop + arg + self.private_field + fn my_function(&self, arg: i32, arg_maybe_default: i64) -> Result { + Ok(self.protected_prop + + self.some_prop + + arg + + self.private_field + + arg_maybe_default as i32) } - fn sum_of_2(&self, arg1: i32, arg2: i32) -> String { - format!("{}", arg1 + arg2) + fn my_procedure(&mut self) { + self.protected_prop += 1; } }