use haz_domain::name::{ProjectName, TagName, TaskName};
use haz_domain::path::PathPattern;
use haz_query_lang::expr::Expr;
use snafu::Snafu;
use crate::expr::glob_intersect::GlobIntersectError;
use crate::expr::relational::RelationalAtom;
use crate::expr::shortcut::BooleanShortcut;
#[derive(Debug, Default, Clone)]
pub struct QuerySpec {
pub tags: Option<Expr<TagName>>,
pub projects: Option<Expr<ProjectName>>,
pub tasks: Option<Expr<TaskName>>,
pub inputs: Option<Expr<PathPattern>>,
pub outputs: Option<Expr<PathPattern>>,
pub child_of: Option<Expr<RelationalAtom>>,
pub parent_of: Option<Expr<RelationalAtom>>,
pub depends_on: Option<Expr<RelationalAtom>>,
pub ancestor_of: Option<Expr<RelationalAtom>>,
pub shortcuts: Vec<BooleanShortcut>,
}
#[derive(Debug, Snafu)]
pub enum QueryError {
#[snafu(display("bearing project '{name}' is not in the workspace"))]
BearingProjectNotInWorkspace {
name: String,
},
#[snafu(display("could not re-parse canonicalised path pattern '{canonical}'"))]
CanonicalisePattern {
canonical: String,
},
#[snafu(display("glob intersection failed: {source}"))]
GlobIntersect {
source: GlobIntersectError,
},
}