1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use LogMessage;
use Pipe;
mod option_error;
mod proxy;
pub use self::option_error::OptionError;
pub use self::proxy::ParserProxy;
pub trait ParserBuilder<P: Pipe> {
type Parser: Parser<P>;
fn new() -> Self;
fn option(&mut self, _name: String, _value: String) {}
fn build(self) -> Result<Self::Parser, OptionError>;
}
pub trait Parser<P: Pipe>: Clone {
fn parse(&mut self, pipe: &mut P, msg: &mut LogMessage, input: &str) -> bool;
}
#[macro_export]
macro_rules! parser_plugin {
($name:ty) => {
pub mod _parser_plugin {
use $crate::{c_int, c_char};
use $crate::LogMessage;
use $crate::LogParser;
use $crate::init_logger;
use $crate::ParserProxy;
use std::ffi::CStr;
use super::*;
#[no_mangle]
pub extern fn native_parser_proxy_init(this: &mut ParserProxy<$name>) -> c_int {
let res = this.init();
match res {
true => 1,
false => 0
}
}
#[no_mangle]
pub extern fn native_parser_proxy_free(_: Box<ParserProxy<$name>>) {
}
#[no_mangle]
pub extern fn native_parser_proxy_set_option(slf: &mut ParserProxy<$name>, key: *const c_char, value: *const c_char) {
let k: String = unsafe { CStr::from_ptr(key).to_owned().to_string_lossy().into_owned() };
let v: String = unsafe { CStr::from_ptr(value).to_owned().to_string_lossy().into_owned() };
slf.set_option(k, v);
}
#[no_mangle]
pub extern fn native_parser_proxy_process(this: &mut ParserProxy<$name>, parent: *mut $crate::sys::LogParser, msg: *mut $crate::sys::LogMessage, input: *const c_char) -> c_int {
let input = unsafe { CStr::from_ptr(input).to_str() };
let mut parent = LogParser::wrap_raw(parent);
let mut msg = LogMessage::wrap_raw(msg);
let result = match input {
Ok(input) => this.process(&mut parent, &mut msg, input),
Err(err) => {
error!("{}", err);
false
}
};
match result {
true => 1,
false => 0
}
}
#[no_mangle]
pub extern fn native_parser_proxy_new() -> Box<ParserProxy<$name>> {
init_logger();
Box::new(ParserProxy::new())
}
#[no_mangle]
pub extern fn native_parser_proxy_clone(slf: &ParserProxy<$name>) -> Box<ParserProxy<$name>> {
let cloned = (*slf).clone();
Box::new(cloned)
}
}
}
}