tender 0.1.1

A Raft-based election framework
Documentation
//! Utilities

use crate::error::Result;
use std::fmt;

pub trait TryToString {
    fn try_to_string(&self) -> Result<String>;
}

impl TryToString for str {
    #[inline]
    fn try_to_string(&self) -> Result<String> {
        let mut s = String::new();
        s.try_reserve(self.len())?;
        s.push_str(self);
        Ok(s)
    }
}

#[repr(transparent)]
struct StrBuf(String);

impl fmt::Write for StrBuf {
    #[inline]
    fn write_str(&mut self, s: &str) -> fmt::Result {
        self.0.try_reserve(s.len()).map_err(|_| fmt::Error)?;
        self.0.push_str(s);
        Ok(())
    }
}

#[inline]
pub fn try_format(args: fmt::Arguments<'_>) -> Result<String> {
    use fmt::Write;

    let mut output = StrBuf(String::new());
    output.write_fmt(args)?;
    Ok(output.0)
}

macro_rules! try_format {
    ($($arg:tt)*) => {{
        let res = $crate::util::try_format(format_args!($($arg)*));
        res
    }}
}

macro_rules! try_format_error {
    ($e: tt, $($arg:tt)*) => {{
        match try_format!($($arg)*) {
            Ok(s) => $crate::error::Error::$e(s),
            Err(e) => e
        }
    }}
}