AttributeSet
This commit is contained in:
parent
d5ebc9515e
commit
28e8ef84e1
@ -3,7 +3,7 @@ use super::*;
|
|||||||
/// An alias, e.g. `name := target`
|
/// An alias, e.g. `name := target`
|
||||||
#[derive(Debug, PartialEq, Clone, Serialize)]
|
#[derive(Debug, PartialEq, Clone, Serialize)]
|
||||||
pub(crate) struct Alias<'src, T = Rc<Recipe<'src>>> {
|
pub(crate) struct Alias<'src, T = Rc<Recipe<'src>>> {
|
||||||
pub(crate) attributes: BTreeSet<Attribute<'src>>,
|
pub(crate) attributes: AttributeSet<'src>,
|
||||||
pub(crate) name: Name<'src>,
|
pub(crate) name: Name<'src>,
|
||||||
#[serde(
|
#[serde(
|
||||||
bound(serialize = "T: Keyed<'src>"),
|
bound(serialize = "T: Keyed<'src>"),
|
||||||
|
@ -120,6 +120,53 @@ impl<'src> Display for Attribute<'src> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
pub(crate) struct AttributeSet<'src> {
|
||||||
|
inner: BTreeSet<Attribute<'src>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'src> Serialize for AttributeSet<'src> {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
self.inner.serialize(serializer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'src> AttributeSet<'src> {
|
||||||
|
pub(crate) fn empty() -> Self {
|
||||||
|
Self {
|
||||||
|
inner: BTreeSet::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn from_map<T>(input: BTreeMap<Attribute<'src>, T>) -> Self {
|
||||||
|
Self {
|
||||||
|
inner: input.into_keys().collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn contains(&self, attribute: &Attribute) -> bool {
|
||||||
|
self.inner.contains(attribute)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the names of all Group attributes defined in this attribute set
|
||||||
|
pub(crate) fn groups(&self) -> Vec<&StringLiteral<'src>> {
|
||||||
|
self
|
||||||
|
.inner
|
||||||
|
.iter()
|
||||||
|
.filter_map(|attr| {
|
||||||
|
if let Attribute::Group(name) = attr {
|
||||||
|
Some(name)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
pub(crate) use {
|
pub(crate) use {
|
||||||
crate::{
|
crate::{
|
||||||
alias::Alias, analyzer::Analyzer, argument_parser::ArgumentParser, assignment::Assignment,
|
alias::Alias, analyzer::Analyzer, argument_parser::ArgumentParser, assignment::Assignment,
|
||||||
assignment_resolver::AssignmentResolver, ast::Ast, attribute::Attribute, binding::Binding,
|
assignment_resolver::AssignmentResolver, ast::Ast, attribute::{Attribute, AttributeSet}, binding::Binding,
|
||||||
color::Color, color_display::ColorDisplay, command_color::CommandColor,
|
color::Color, color_display::ColorDisplay, command_color::CommandColor,
|
||||||
command_ext::CommandExt, compilation::Compilation, compile_error::CompileError,
|
command_ext::CommandExt, compilation::Compilation, compile_error::CompileError,
|
||||||
compile_error_kind::CompileErrorKind, compiler::Compiler, condition::Condition,
|
compile_error_kind::CompileErrorKind, compiler::Compiler, condition::Condition,
|
||||||
|
@ -460,7 +460,7 @@ impl<'run, 'src> Parser<'run, 'src> {
|
|||||||
/// Parse an alias, e.g `alias name := target`
|
/// Parse an alias, e.g `alias name := target`
|
||||||
fn parse_alias(
|
fn parse_alias(
|
||||||
&mut self,
|
&mut self,
|
||||||
attributes: BTreeSet<Attribute<'src>>,
|
attributes: AttributeSet<'src>,
|
||||||
) -> CompileResult<'src, Alias<'src, Name<'src>>> {
|
) -> CompileResult<'src, Alias<'src, Name<'src>>> {
|
||||||
self.presume_keyword(Keyword::Alias)?;
|
self.presume_keyword(Keyword::Alias)?;
|
||||||
let name = self.parse_name()?;
|
let name = self.parse_name()?;
|
||||||
|
Loading…
Reference in New Issue
Block a user