refactor FFI

This commit is contained in:
ssrlive 2024-02-07 23:32:51 +08:00
parent 8067394003
commit 8a67915388
9 changed files with 84 additions and 31 deletions

View file

@ -81,9 +81,10 @@ impl Args {
}
}
#[repr(C)]
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
pub enum ArgVerbosity {
Off,
Off = 0,
Error,
Warn,
#[default]
@ -92,6 +93,47 @@ pub enum ArgVerbosity {
Trace,
}
#[cfg(target_os = "android")]
impl TryFrom<jni::sys::jint> for ArgVerbosity {
type Error = Error;
fn try_from(value: jni::sys::jint) -> Result<Self> {
match value {
0 => Ok(ArgVerbosity::Off),
1 => Ok(ArgVerbosity::Error),
2 => Ok(ArgVerbosity::Warn),
3 => Ok(ArgVerbosity::Info),
4 => Ok(ArgVerbosity::Debug),
5 => Ok(ArgVerbosity::Trace),
_ => Err(Error::from("Invalid verbosity level")),
}
}
}
impl From<ArgVerbosity> for log::LevelFilter {
fn from(verbosity: ArgVerbosity) -> Self {
match verbosity {
ArgVerbosity::Off => log::LevelFilter::Off,
ArgVerbosity::Error => log::LevelFilter::Error,
ArgVerbosity::Warn => log::LevelFilter::Warn,
ArgVerbosity::Info => log::LevelFilter::Info,
ArgVerbosity::Debug => log::LevelFilter::Debug,
ArgVerbosity::Trace => log::LevelFilter::Trace,
}
}
}
impl From<log::Level> for ArgVerbosity {
fn from(level: log::Level) -> Self {
match level {
log::Level::Error => ArgVerbosity::Error,
log::Level::Warn => ArgVerbosity::Warn,
log::Level::Info => ArgVerbosity::Info,
log::Level::Debug => ArgVerbosity::Debug,
log::Level::Trace => ArgVerbosity::Trace,
}
}
}
impl std::fmt::Display for ArgVerbosity {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
@ -109,14 +151,28 @@ impl std::fmt::Display for ArgVerbosity {
/// - Virtual: Use a virtual DNS server to handle DNS queries, also known as Fake-IP mode
/// - OverTcp: Use TCP to send DNS queries to the DNS server
/// - Direct: Do not handle DNS by relying on DNS server bypassing
#[repr(C)]
#[derive(Default, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, clap::ValueEnum)]
pub enum ArgDns {
Virtual,
Virtual = 0,
OverTcp,
#[default]
Direct,
}
#[cfg(target_os = "android")]
impl TryFrom<jni::sys::jint> for ArgDns {
type Error = Error;
fn try_from(value: jni::sys::jint) -> Result<Self> {
match value {
0 => Ok(ArgDns::Virtual),
1 => Ok(ArgDns::OverTcp),
2 => Ok(ArgDns::Direct),
_ => Err(Error::from("Invalid DNS strategy")),
}
}
}
#[derive(Clone, Debug)]
pub struct ArgProxy {
pub proxy_type: ProxyType,