aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-semver/src/constraint
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe-semver/src/constraint')
-rw-r--r--crates/shirabe-semver/src/constraint/multi_constraint.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/crates/shirabe-semver/src/constraint/multi_constraint.rs b/crates/shirabe-semver/src/constraint/multi_constraint.rs
index 4e9b8cf5..30c2edd6 100644
--- a/crates/shirabe-semver/src/constraint/multi_constraint.rs
+++ b/crates/shirabe-semver/src/constraint/multi_constraint.rs
@@ -4,11 +4,13 @@ use crate::constraint::AnyConstraint;
use crate::constraint::Bound;
use crate::constraint::MatchAllConstraint;
use shirabe_php_shim::CmpOp;
+use std::sync::OnceLock;
#[derive(Debug, Clone)]
pub struct MultiConstraint {
pub(crate) constraints: Vec<AnyConstraint>,
pub(crate) pretty_string: Option<String>,
+ string: OnceLock<String>,
pub(crate) conjunctive: bool,
}
@@ -28,6 +30,7 @@ impl MultiConstraint {
Self {
constraints,
pretty_string,
+ string: OnceLock::new(),
conjunctive,
}
}
@@ -251,8 +254,11 @@ impl MultiConstraint {
impl std::fmt::Display for MultiConstraint {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- let parts: Vec<String> = self.constraints.iter().map(|c| c.to_string()).collect();
- let sep = if self.conjunctive { " " } else { " || " };
- write!(f, "[{}]", parts.join(sep))
+ let string = self.string.get_or_init(|| {
+ let parts: Vec<String> = self.constraints.iter().map(|c| c.to_string()).collect();
+ let sep = if self.conjunctive { " " } else { " || " };
+ format!("[{}]", parts.join(sep))
+ });
+ f.write_str(string)
}
}