fn parse_contains_constraint()

in crates/concrete-syntax/src/models/concrete_syntax/parser.rs [263:295]


  fn parse_contains_constraint(pair: Pair<Rule>) -> Result<CsConstraint, String> {
    let mut inner = pair.into_inner();

    // First should be constraint_target
    let target_pair = inner
      .next()
      .ok_or("Expected constraint_target in contains_constraint")?;
    let target_name = Self::extract_target_name(target_pair)?;

    // Check for optional "not" keyword and delimited_pattern
    let mut negated = false;
    let mut pattern_elements = Vec::new();

    for next_pair in inner {
      match next_pair.as_rule() {
        Rule::not_keyword => negated = true,
        Rule::delimited_pattern => pattern_elements = Self::parse_delimited_pattern(next_pair)?,
        _ => continue, // Skip other tokens like "contains"
      }
    }

    let base_constraint = CsConstraint::Contains {
      target: target_name,
      pattern: pattern_elements,
      resolved_pattern: None, // Initialize as None
    };

    if negated {
      Ok(CsConstraint::Not(Box::new(base_constraint)))
    } else {
      Ok(base_constraint)
    }
  }