Simple macros for declaring String-base new types.
This crate provides simple macros that generate String based new types. The two primary macros
implement the validity rules for the new type by either 1) providing a predicate that is used by
the is_valid
associated function, or 2) providing a function to parse and return a string which
is then called by FromStr::from_str
.
Both of these methods produce a new type, with the following:
is_valid
that returns true
if the string provided would be a
valid value for the type.Clone
, Debug
, PartialEq
, PartialOrd
, Eq
, Ord
,
and Hash
.Display
for T
that simply returns the inner value.From<T>
for String
.AsRef
for T
with the target type str
.Deref
for T
with the target type str
.FromStr
.Additional user-required traits can also be added to the macro to be derived by the implementation.
The following example constructs a new string type that implements an Identifier
value. This
value must be ASCII, alphanumeric, the '_' character and must not be empty.
```rust use std::fmt::{Display, Formatter}; use std::str::FromStr;
fn isidentifiervalue(s: &str) -> bool { !s.isempty() && s.chars().all(|c| c.isasciialphanumeric() || c == '') }
isvalidnewstring!(Identifier, isidentifiervalue);
assert!(!Identifier::isvalid("")); assert!(!Identifier::isvalid("hi!")); assert!(!Identifier::isvalid("hello world")); assert!(!Identifier::isvalid("9.99"));
asserteq!( Identifier::fromstr("hi").unwrap().tostring(), String::from("hi") ); asserteq!( Identifier::fromstr("helloworld").unwrap().tostring(), String::from("helloworld") ); ```
The macro new_unchecked
will add a constructor to the type that allows a
trusted client to bypass the validity checks.
``` rust new_unchecked!(pub(crate) Identifier);
asserteq!( Identifier::fromstr("hi").unwrap(), Identifier::new_unchecked("hi") ); ```
In the example above you can see the necessary use-statements for the trait implementations the
macros generate. Unless you use regex_is_valid
there are no crate dependencies; if you do you will
need to add lazy_static
and regex
dependencies.
Version 0.2.0
;
instead of ,
to separate the additional derive macros,use_required
macro any
more,FromStr
.new_unchecked
macro for validity bypass.Version 0.1.2
derive
attribute on the generated struct.Version 0.1.1
use_required
macro.lazy_static
and regex
dev dependencies, if you don't use them, you don't need them.cargo-husky
for Git cleanliness.Version 0.1.0