diff --git a/src/internal_macros.rs b/src/internal_macros.rs index afb6658..6af38a4 100644 --- a/src/internal_macros.rs +++ b/src/internal_macros.rs @@ -12,6 +12,10 @@ // If not, see . // +//! Internal Macros +//! +//! Macros meant to be used inside the Rust Bitcoin library + macro_rules! impl_consensus_encoding { ($thing:ident, $($field:ident),+) => ( impl ::consensus::encode::Encodable for $thing { @@ -416,3 +420,107 @@ macro_rules! serde_struct_impl { } ) } + +macro_rules! user_enum { + ( + $(#[$attr:meta])* + pub enum $name:ident { + $(#[$doc:meta] + $elem:ident <-> $txt:expr),* + } + ) => ( + $(#[$attr])* + pub enum $name { + $(#[$doc] $elem),* + } + + impl ::std::fmt::Debug for $name { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + f.pad(match *self { + $($name::$elem => $txt),* + }) + } + } + + impl ::std::fmt::Display for $name { + fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + f.pad(match *self { + $($name::$elem => $txt),* + }) + } + } + + impl ::std::str::FromStr for $name { + type Err = ::std::io::Error; + #[inline] + fn from_str(s: &str) -> Result { + match s { + $($txt => Ok($name::$elem)),*, + _ => Err(::std::io::Error::new( + ::std::io::ErrorKind::InvalidInput, + format!("Unknown network (type {})", s), + )), + } + } + } + + #[cfg(feature = "serde")] + impl<'de> $crate::serde::Deserialize<'de> for $name { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: $crate::serde::Deserializer<'de>, + { + use $crate::std::fmt::{self, Formatter}; + + struct Visitor; + impl<'de> $crate::serde::de::Visitor<'de> for Visitor { + type Value = $name; + + fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { + formatter.write_str("an enum value") + } + + fn visit_str(self, v: &str) -> Result + where + E: $crate::serde::de::Error, + { + static FIELDS: &'static [&'static str] = &[$(stringify!($txt)),*]; + + $( if v == $txt { Ok($name::$elem) } )else* + else { + Err(E::unknown_variant(v, FIELDS)) + } + } + + fn visit_borrowed_str(self, v: &'de str) -> Result + where + E: $crate::serde::de::Error, + { + self.visit_str(v) + } + + fn visit_string(self, v: String) -> Result + where + E: $crate::serde::de::Error, + { + self.visit_str(&v) + } + + } + + deserializer.deserialize_str(Visitor) + } + } + + #[cfg(feature = "serde")] + impl ::serde::Serialize for $name { + fn serialize(&self, serializer: S) -> Result + where + S: ::serde::Serializer, + { + serializer.serialize_str(&self.to_string()) + } + } + ); +} diff --git a/src/lib.rs b/src/lib.rs index 5311f61..362f059 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -58,7 +58,6 @@ mod test_macros; #[macro_use] mod internal_macros; #[macro_use] -pub mod macros; pub mod network; pub mod blockdata; pub mod util; @@ -82,4 +81,4 @@ pub use util::decimal::Decimal; pub use util::decimal::UDecimal; #[cfg(feature = "fuzztarget")] -pub mod fuzz_util; \ No newline at end of file +pub mod fuzz_util; diff --git a/src/macros.rs b/src/macros.rs deleted file mode 100644 index 718d4ae..0000000 --- a/src/macros.rs +++ /dev/null @@ -1,123 +0,0 @@ -// Rust Bitcoin Library -// Written in 2014 by -// Andrew Poelstra -// -// To the extent possible under law, the author(s) have dedicated all -// copyright and related and neighboring rights to this software to -// the public domain worldwide. This software is distributed without -// any warranty. -// -// You should have received a copy of the CC0 Public Domain Dedication -// along with this software. -// If not, see . -// - -//! Macros -//! -//! Macros available to users of the Bitcoin library - -#[macro_export] -macro_rules! user_enum { - ( - $(#[$attr:meta])* - pub enum $name:ident { - $(#[$doc:meta] - $elem:ident <-> $txt:expr),* - } - ) => ( - $(#[$attr])* - pub enum $name { - $(#[$doc] $elem),* - } - - impl ::std::fmt::Debug for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - f.pad(match *self { - $($name::$elem => $txt),* - }) - } - } - - impl ::std::fmt::Display for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - f.pad(match *self { - $($name::$elem => $txt),* - }) - } - } - - impl ::std::str::FromStr for $name { - type Err = ::std::io::Error; - #[inline] - fn from_str(s: &str) -> Result { - match s { - $($txt => Ok($name::$elem)),*, - _ => Err(::std::io::Error::new( - ::std::io::ErrorKind::InvalidInput, - format!("Unknown network (type {})", s), - )), - } - } - } - - #[cfg(feature = "serde")] - impl<'de> $crate::serde::Deserialize<'de> for $name { - #[inline] - fn deserialize(deserializer: D) -> Result - where - D: $crate::serde::Deserializer<'de>, - { - use $crate::std::fmt::{self, Formatter}; - - struct Visitor; - impl<'de> $crate::serde::de::Visitor<'de> for Visitor { - type Value = $name; - - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - formatter.write_str("an enum value") - } - - fn visit_str(self, v: &str) -> Result - where - E: $crate::serde::de::Error, - { - static FIELDS: &'static [&'static str] = &[$(stringify!($txt)),*]; - - $( if v == $txt { Ok($name::$elem) } )else* - else { - Err(E::unknown_variant(v, FIELDS)) - } - } - - fn visit_borrowed_str(self, v: &'de str) -> Result - where - E: $crate::serde::de::Error, - { - self.visit_str(v) - } - - fn visit_string(self, v: String) -> Result - where - E: $crate::serde::de::Error, - { - self.visit_str(&v) - } - - } - - deserializer.deserialize_str(Visitor) - } - } - - #[cfg(feature = "serde")] - impl ::serde::Serialize for $name { - fn serialize(&self, serializer: S) -> Result - where - S: ::serde::Serializer, - { - serializer.serialize_str(&self.to_string()) - } - } - ); -} - diff --git a/src/test_macros.rs b/src/test_macros.rs index b2e9caf..6bf5e3d 100644 --- a/src/test_macros.rs +++ b/src/test_macros.rs @@ -16,7 +16,6 @@ //! //! Internal macros used for unit tests -#[macro_export] #[cfg(all(feature = "serde", feature = "strason"))] macro_rules! serde_round_trip ( ($var:expr) => ({