@@ -2,11 +2,13 @@ use anyhow::{anyhow, Result};
2
2
3
3
use super :: EnumConversionError ;
4
4
use crate :: fst:: CFst ;
5
- use crate :: { get, wrap, RUSTFST_FFI_RESULT } ;
5
+ use crate :: { get, wrap, CLabel , RUSTFST_FFI_RESULT } ;
6
6
7
7
use ffi_convert:: * ;
8
+ use rustfst:: algorithms:: compose:: matchers:: MatcherRewriteMode ;
8
9
use rustfst:: algorithms:: compose:: {
9
- compose, compose_with_config, ComposeConfig , ComposeFilterEnum ,
10
+ compose, compose_with_config, ComposeConfig , ComposeFilterEnum , MatcherConfig ,
11
+ SigmaMatcherConfig ,
10
12
} ;
11
13
use rustfst:: fst_impls:: VectorFst ;
12
14
use rustfst:: semirings:: TropicalWeight ;
@@ -50,21 +52,149 @@ impl CReprOf<ComposeFilterEnum> for CComposeFilterEnum {
50
52
}
51
53
}
52
54
55
+ #[ derive( RawPointerConverter , Debug , Clone ) ]
56
+ pub struct CMatcherRewriteMode ( pub ( crate ) usize ) ;
57
+
58
+ impl AsRust < MatcherRewriteMode > for CMatcherRewriteMode {
59
+ fn as_rust ( & self ) -> Result < MatcherRewriteMode , AsRustError > {
60
+ match self . 0 {
61
+ 0 => Ok ( MatcherRewriteMode :: MatcherRewriteAuto ) ,
62
+ 1 => Ok ( MatcherRewriteMode :: MatcherRewriteAlways ) ,
63
+ 2 => Ok ( MatcherRewriteMode :: MatcherRewriteNever ) ,
64
+ _ => Err ( AsRustError :: Other ( Box :: new ( EnumConversionError { } ) ) ) ,
65
+ }
66
+ }
67
+ }
68
+
69
+ impl CDrop for CMatcherRewriteMode {
70
+ fn do_drop ( & mut self ) -> Result < ( ) , CDropError > {
71
+ Ok ( ( ) )
72
+ }
73
+ }
74
+
75
+ impl CReprOf < MatcherRewriteMode > for CMatcherRewriteMode {
76
+ fn c_repr_of ( value : MatcherRewriteMode ) -> Result < CMatcherRewriteMode , CReprOfError > {
77
+ let variant = match value {
78
+ MatcherRewriteMode :: MatcherRewriteAuto => 0 ,
79
+ MatcherRewriteMode :: MatcherRewriteAlways => 1 ,
80
+ MatcherRewriteMode :: MatcherRewriteNever => 2 ,
81
+ } ;
82
+ Ok ( CMatcherRewriteMode ( variant) )
83
+ }
84
+ }
85
+
86
+ #[ derive( AsRust , CReprOf , CDrop , RawPointerConverter , Debug , Clone ) ]
87
+ #[ target_type( SigmaMatcherConfig ) ]
88
+ pub struct CSigmaMatcherConfig {
89
+ pub sigma_label : CLabel ,
90
+ pub rewrite_mode : CMatcherRewriteMode ,
91
+ }
92
+
93
+ #[ derive( RawPointerConverter , Debug , Clone , Default ) ]
94
+ pub struct CMatcherConfig {
95
+ pub sigma_matcher_config : Option < CSigmaMatcherConfig > ,
96
+ }
97
+
98
+ impl AsRust < MatcherConfig > for CMatcherConfig {
99
+ fn as_rust ( & self ) -> Result < MatcherConfig , AsRustError > {
100
+ if let Some ( v) = & self . sigma_matcher_config {
101
+ Ok ( MatcherConfig {
102
+ sigma_matcher_config : Some ( v. as_rust ( ) ?) ,
103
+ } )
104
+ } else {
105
+ Ok ( MatcherConfig {
106
+ sigma_matcher_config : None ,
107
+ } )
108
+ }
109
+ }
110
+ }
111
+
112
+ impl CDrop for CMatcherConfig {
113
+ fn do_drop ( & mut self ) -> Result < ( ) , CDropError > {
114
+ self . sigma_matcher_config
115
+ . as_mut ( )
116
+ . map ( |v| v. do_drop ( ) )
117
+ . transpose ( ) ?;
118
+ Ok ( ( ) )
119
+ }
120
+ }
121
+
122
+ impl CReprOf < MatcherConfig > for CMatcherConfig {
123
+ fn c_repr_of ( input : MatcherConfig ) -> Result < Self , CReprOfError > {
124
+ if let Some ( v) = input. sigma_matcher_config {
125
+ Ok ( Self {
126
+ sigma_matcher_config : Some ( CReprOf :: c_repr_of ( v) ?) ,
127
+ } )
128
+ } else {
129
+ Ok ( Self {
130
+ sigma_matcher_config : None ,
131
+ } )
132
+ }
133
+ }
134
+ }
135
+
53
136
#[ derive( AsRust , CReprOf , CDrop , RawPointerConverter , Debug ) ]
54
137
#[ target_type( ComposeConfig ) ]
55
138
pub struct CComposeConfig {
56
139
pub compose_filter : CComposeFilterEnum ,
57
140
pub connect : bool ,
141
+ pub matcher1_config : CMatcherConfig ,
142
+ pub matcher2_config : CMatcherConfig ,
143
+ }
144
+
145
+ #[ no_mangle]
146
+ pub extern "C" fn fst_matcher_config_new (
147
+ sigma_label : libc:: size_t ,
148
+ rewrite_mode : libc:: size_t ,
149
+ config : * mut * const CMatcherConfig ,
150
+ ) -> RUSTFST_FFI_RESULT {
151
+ wrap ( || {
152
+ let matcher_config = CMatcherConfig {
153
+ sigma_matcher_config : Some ( CSigmaMatcherConfig {
154
+ sigma_label : sigma_label as CLabel ,
155
+ rewrite_mode : CMatcherRewriteMode ( rewrite_mode as usize ) ,
156
+ } ) ,
157
+ } ;
158
+
159
+ unsafe { * config = matcher_config. into_raw_pointer ( ) } ;
160
+ Ok ( ( ) )
161
+ } )
58
162
}
59
163
60
164
#[ no_mangle]
61
165
pub extern "C" fn fst_compose_config_new (
62
166
compose_filter : libc:: size_t ,
63
167
connect : bool ,
168
+ matcher1_config : * const CMatcherConfig ,
169
+ matcher2_config : * const CMatcherConfig ,
64
170
config : * mut * const CComposeConfig ,
65
171
) -> RUSTFST_FFI_RESULT {
66
172
wrap ( || {
173
+ let matcher1_config = if matcher1_config. is_null ( ) {
174
+ CMatcherConfig :: default ( )
175
+ } else {
176
+ unsafe {
177
+ <CMatcherConfig as ffi_convert:: RawBorrow < CMatcherConfig > >:: raw_borrow (
178
+ matcher1_config,
179
+ ) ?
180
+ }
181
+ . clone ( )
182
+ } ;
183
+
184
+ let matcher2_config = if matcher2_config. is_null ( ) {
185
+ CMatcherConfig :: default ( )
186
+ } else {
187
+ unsafe {
188
+ <CMatcherConfig as ffi_convert:: RawBorrow < CMatcherConfig > >:: raw_borrow (
189
+ matcher2_config,
190
+ ) ?
191
+ }
192
+ . clone ( )
193
+ } ;
194
+
67
195
let compose_config = CComposeConfig {
196
+ matcher1_config,
197
+ matcher2_config,
68
198
compose_filter : CComposeFilterEnum ( compose_filter as usize ) ,
69
199
connect,
70
200
} ;
0 commit comments