dynfmt 0.1.5

A crate for formatting strings dynamically.
Documentation
use std::borrow::Cow;

use dynfmt::{Error, FormatType, Position};

macro_rules! test_fmt {
    ($name:ident, $expected:expr, $error:expr) => {
        #[test]
        fn $name() {
            assert_eq!($expected, format!("{}", $error));
        }
    };
}

test_fmt!(bad_format, "unsupported format 'x'", Error::BadFormat('x'));
test_fmt!(
    parse,
    "error parsing format string: x",
    Error::Parse(Cow::Borrowed("x"))
);
test_fmt!(
    list_required,
    "format requires an argument list",
    Error::ListRequired
);
test_fmt!(
    map_required,
    "format requires an argument map",
    Error::MapRequired
);
test_fmt!(
    missing_arg_key,
    "missing argument: x",
    Error::MissingArg(Position::Key("x"))
);
test_fmt!(
    missing_arg_auto,
    "missing argument: {next}",
    Error::MissingArg(Position::Auto)
);
test_fmt!(
    missing_arg_index,
    "missing argument: 42",
    Error::MissingArg(Position::Index(42))
);
test_fmt!(
    bad_arg_key,
    "argument 'x' cannot be formatted as object",
    Error::BadArg(Position::Key("x"), FormatType::Object)
);
test_fmt!(
    bad_arg_auto,
    "argument '{next}' cannot be formatted as object",
    Error::BadArg(Position::Auto, FormatType::Object)
);
test_fmt!(
    bad_arg_index,
    "argument '42' cannot be formatted as object",
    Error::BadArg(Position::Index(42), FormatType::Object)
);
test_fmt!(
    bad_data_key,
    "error formatting argument 'x': %x",
    Error::BadData(Position::Key("x"), "%x".into())
);
test_fmt!(
    bad_data_auto,
    "error formatting argument '{next}': %x",
    Error::BadData(Position::Auto, "%x".into())
);
test_fmt!(
    bad_data_index,
    "error formatting argument '42': %x",
    Error::BadData(Position::Index(42), "%x".into())
);
test_fmt!(
    io_error,
    "oops",
    Error::Io(std::io::Error::new(std::io::ErrorKind::Other, "oops"))
);