pub use snafu::{ensure, Backtrace, ErrorCompat, ResultExt, Snafu};
use std::io;
use crate::Packet;
#[derive(Debug, Snafu)]
#[snafu(visibility = "pub")]
pub enum TunError {
#[snafu(display("fail to create tunnel: {}", source))]
CreateTun { source: io::Error },
#[snafu(display("execute shell command \"{}\" fail: {}", cmd, source))]
RunShellError { source: io::Error, cmd: String },
#[snafu(display("execute shell command:\n\t{}\nfail:\n\t{}", cmd, result))]
ShellResultError {
result: String,
cmd: String,
backtrace: Backtrace,
},
#[snafu(display("read error: {}", source))]
ReadError { source: io::Error },
#[snafu(display("write error: {}", source))]
WriteError { source: io::Error },
#[snafu(display("parse addr to ipNet fail: {}", source))]
ParseAddrFail { source: ipnet::AddrParseError },
#[snafu(display("write error: {}", source))]
PktWriteError {
source: async_channel::SendError<Packet>,
},}
pub type Result<T, E = TunError> = std::result::Result<T, E>;