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
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>;