blob: faa00f420e3347bad31595f79701f77a69f75ed1 [file] [log] [blame] [edit]
/// Data stored within a `Structable` or an `Enumerable`.
#[derive(Debug)]
pub enum Fields<'a> {
/// Named fields
Named(&'a [NamedField<'a>]),
/// Unnamed (positional) fields or unit
///
/// The `usize` value represents the number of fields.
Unnamed(usize),
}
/// A named field
#[derive(Debug, Clone, Copy)]
pub struct NamedField<'a>(&'a str);
impl Fields<'_> {
/// Returns `true` if the fields are named.
///
/// # Examples
///
/// Named fields
///
/// ```
/// use valuable::Fields;
///
/// let fields = Fields::Named(&[]);
/// assert!(fields.is_named());
/// ```
///
/// Unnamed fields
///
/// ```
/// use valuable::Fields;
///
/// let fields = Fields::Unnamed(2);
/// assert!(!fields.is_named());
/// ```
pub const fn is_named(&self) -> bool {
matches!(self, Fields::Named(..))
}
/// Returns `true` if the fields are unnamed.
///
/// # Examples
///
/// Named fields
///
/// ```
/// use valuable::Fields;
///
/// let fields = Fields::Named(&[]);
/// assert!(!fields.is_unnamed());
/// ```
///
/// Unnamed fields
///
/// ```
/// use valuable::Fields;
///
/// let fields = Fields::Unnamed(3);
/// assert!(fields.is_unnamed());
/// ```
pub const fn is_unnamed(&self) -> bool {
matches!(self, Fields::Unnamed(_))
}
/// Returns the number of fields.
///
/// # Examples
///
/// Named fields
///
/// ```
/// use valuable::{Fields, NamedField};
///
/// let fields = &[
/// NamedField::new("alice"),
/// NamedField::new("bob"),
/// ];
/// let fields = Fields::Named(fields);
///
/// assert_eq!(fields.len(), 2);
/// ```
///
/// Unnamed fields
///
/// ```
/// use valuable::Fields;
///
/// let fields = Fields::Unnamed(2);
/// assert_eq!(fields.len(), 2);
/// ```
pub const fn len(&self) -> usize {
match self {
Self::Named(names) => names.len(),
Self::Unnamed(len) => *len,
}
}
/// Returns `true` if this set of fields defines no fields.
///
/// # Examples
///
/// Named fields
///
/// ```
/// use valuable::{Fields, NamedField};
///
/// let fields = &[
/// NamedField::new("alice"),
/// NamedField::new("bob"),
/// ];
/// let non_empty = Fields::Named(fields);
///
/// let empty = Fields::Named(&[]);
///
/// assert!(!non_empty.is_empty());
/// assert!(empty.is_empty());
/// ```
///
/// Unnamed fields
///
/// ```
/// use valuable::Fields;
///
/// let non_empty = Fields::Unnamed(2);
/// let empty = Fields::Unnamed(0);
///
/// assert!(!non_empty.is_empty());
/// assert!(empty.is_empty());
/// ```
pub const fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<'a> NamedField<'a> {
/// Create a new `NamedField` instance with the given name.
///
/// # Examples
///
/// ```
/// use valuable::NamedField;
///
/// let field = NamedField::new("hello");
/// assert_eq!("hello", field.name());
/// ```
pub const fn new(name: &'a str) -> NamedField<'a> {
NamedField(name)
}
/// Returns the field name
///
/// # Examples
///
/// ```
/// use valuable::NamedField;
///
/// let field = NamedField::new("hello");
/// assert_eq!("hello", field.name());
/// ```
pub const fn name(&self) -> &str {
self.0
}
}