#![cfg(target_os = "linux")]
#![doc(html_playground_url = "https://play.rust-lang.org/")]
#[derive(Debug)]
pub enum Error {
IO(std::io::Error),
BadFormat,
ParseInt(std::num::ParseIntError),
ParseFloat(std::num::ParseFloatError),
ParseAddr(std::net::AddrParseError),
}
impl From<std::net::AddrParseError> for Error {
fn from(err: std::net::AddrParseError) -> Self {
Error::ParseAddr(err)
}
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::IO(err)
}
}
impl From<std::num::ParseIntError> for Error {
fn from(err: std::num::ParseIntError) -> Self {
Error::ParseInt(err)
}
}
impl From<std::num::ParseFloatError> for Error {
fn from(err: std::num::ParseFloatError) -> Self {
Error::ParseFloat(err)
}
}
type Result<T> = std::result::Result<T, Error>;
macro_rules! default_read {
($fn_name: ident, $path: expr) => {
pub fn $fn_name() -> $crate::Result<String> {
Ok(std::fs::read_to_string($path)?)
}
};
}
macro_rules! default_list {
($fn_name: ident, $path: expr, $return_type: ty, $parse_code: ident, $sep: expr, $skip: expr) => {
pub fn $fn_name() -> $crate::Result<Vec<$return_type>> {
let content = std::fs::read_to_string($path)?;
let mut ret = vec![];
let mut block_iter = content.trim().split($sep);
for _ in 0..$skip {
let _ = block_iter.next();
}
for block in block_iter {
ret.push($parse_code(block)?);
}
Ok(ret)
}
};
($fn_name: ident, $path: expr, $return_type: ty, $parse_code: ident, $sep: expr) => {
default_list! {$fn_name, $path, $return_type, $parse_code, $sep, 0}
};
($fn_name: ident, $path: expr, $return_type: ty, $parse_code: ident) => {
default_list! {$fn_name, $path, $return_type, $parse_code, '\n', 0}
};
}
macro_rules! getter_gen {
(
$(
$filed: ident : $type: ty
), *
) => {
$(
#[inline(always)]
pub fn $filed(&self) -> &$type {
&self.$filed
}
) *
};
}
pub mod proc;
#[doc(inline)]
pub use proc::*;