1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
use std::fmt::{self, Write};
use crate::fields::Fields;
use crate::formatter::Formatter;
use crate::r#type::Type;
/// Defines an enum variant.
#[derive(Debug, Clone)]
pub struct Variant {
/// The name of the variant.
name: String,
/// The variant's fields.
fields: Fields,
}
impl Variant {
/// Return a new enum variant with the given name.
///
/// # Arguments
///
/// * `name` - The name of the enum variant.
///
/// # Examples
///
/// ```
/// use rust_codegen::Variant;
///
/// let foo_variant = Variant::new("Foo");
/// ```
pub fn new(name: &str) -> Self {
Variant {
name: name.to_string(),
fields: Fields::Empty,
}
}
/// Add a named field to the variant.
///
/// # Arguments
///
/// * `name` - The name of the field.
/// * `ty` - The type of the field.
///
/// # Examples
///
/// ```
/// use rust_codegen::Variant;
///
/// let mut foo_variant = Variant::new("Foo");
/// foo_variant.named("Bar", "String");
/// ```
pub fn named<T>(&mut self, name: &str, ty: T) -> &mut Self
where
T: Into<Type>,
{
self.fields.named(name, ty);
self
}
/// Add a tuple field to the variant.
///
/// # Arguments
///
/// * `ty` - The type of the tuple.
///
/// # Examples
///
/// ```
/// use rust_codegen::Variant;
///
/// let mut foo_variant = Variant::new("Foo");
/// foo_variant.tuple("i32");
/// ```
pub fn tuple(&mut self, ty: &str) -> &mut Self {
self.fields.tuple(ty);
self
}
/// Formats the variant using the given formatter.
///
/// # Arguments
///
/// * `fmt` - The formatter to use.
///
/// # Examples
///
/// ```
/// use rust_codegen::{Formatter,Variant};
///
/// let mut dest = String::new();
/// let mut fmt = Formatter::new(&mut dest);
///
/// let mut foo_variant = Variant::new("Foo");
/// foo_variant.fmt(&mut fmt);
/// ```
pub fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
write!(fmt, "{}", self.name)?;
self.fields.fmt(fmt)?;
write!(fmt, ",\n")?;
Ok(())
}
}