#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum CompatDirectiveError {
#[error("`@compat` takes only `breaking`, got `{0}`")]
Value(String),
#[error("`@compat` is declared {0} times; one migration states its compatibility once")]
Repeated(usize),
}
const DIRECTIVE: &str = "-- @compat:";
pub fn parse(sql: &str) -> Result<bool, CompatDirectiveError> {
let values: Vec<&str> = sql
.lines()
.map(str::trim)
.take_while(|line| line.is_empty() || line.starts_with("--"))
.filter_map(|line| line.strip_prefix(DIRECTIVE))
.map(str::trim)
.collect();
match values.as_slice() {
[] => Ok(false),
["breaking"] => Ok(true),
[other] => Err(CompatDirectiveError::Value((*other).to_owned())),
many => Err(CompatDirectiveError::Repeated(many.len())),
}
}