use crate::AstNode;
use crate::SyntaxKind;
use crate::SyntaxNode;
use crate::TreeNode;
mod decls;
pub(crate) mod display;
mod r#enum;
mod expr;
mod import;
mod r#struct;
mod task;
mod tokens;
mod workflow;
pub use decls::*;
pub use display::format_meta_value;
pub use display::get_param_meta;
pub use r#enum::*;
pub use expr::*;
pub use import::*;
pub use r#struct::*;
pub use task::*;
pub use tokens::*;
pub use workflow::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Ast<N: TreeNode = SyntaxNode>(pub(crate) N);
impl<N: TreeNode> Ast<N> {
pub fn items(&self) -> impl Iterator<Item = DocumentItem<N>> + use<'_, N> {
DocumentItem::children(&self.0)
}
pub fn imports(&self) -> impl Iterator<Item = ImportStatement<N>> + use<'_, N> {
self.children()
}
pub fn structs(&self) -> impl Iterator<Item = StructDefinition<N>> + use<'_, N> {
self.children()
}
pub fn enums(&self) -> impl Iterator<Item = EnumDefinition<N>> + use<'_, N> {
self.children()
}
pub fn tasks(&self) -> impl Iterator<Item = TaskDefinition<N>> + use<'_, N> {
self.children()
}
pub fn workflows(&self) -> impl Iterator<Item = WorkflowDefinition<N>> + use<'_, N> {
self.children()
}
}
impl<N: TreeNode> AstNode<N> for Ast<N> {
fn can_cast(kind: SyntaxKind) -> bool {
kind == SyntaxKind::RootNode
}
fn cast(inner: N) -> Option<Self> {
match inner.kind() {
SyntaxKind::RootNode => Some(Self(inner)),
_ => None,
}
}
fn inner(&self) -> &N {
&self.0
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DocumentItem<N: TreeNode = SyntaxNode> {
Import(ImportStatement<N>),
Struct(StructDefinition<N>),
Enum(EnumDefinition<N>),
Task(TaskDefinition<N>),
Workflow(WorkflowDefinition<N>),
}
impl<N: TreeNode> DocumentItem<N> {
pub fn can_cast(kind: SyntaxKind) -> bool
where
Self: Sized,
{
matches!(
kind,
SyntaxKind::ImportStatementNode
| SyntaxKind::StructDefinitionNode
| SyntaxKind::EnumDefinitionNode
| SyntaxKind::TaskDefinitionNode
| SyntaxKind::WorkflowDefinitionNode
)
}
pub fn cast(inner: N) -> Option<Self> {
match inner.kind() {
SyntaxKind::ImportStatementNode => Some(Self::Import(
ImportStatement::cast(inner).expect("import statement to cast"),
)),
SyntaxKind::StructDefinitionNode => Some(Self::Struct(
StructDefinition::cast(inner).expect("struct definition to cast"),
)),
SyntaxKind::EnumDefinitionNode => Some(Self::Enum(
EnumDefinition::cast(inner).expect("enum definition to cast"),
)),
SyntaxKind::TaskDefinitionNode => Some(Self::Task(
TaskDefinition::cast(inner).expect("task definition to cast"),
)),
SyntaxKind::WorkflowDefinitionNode => Some(Self::Workflow(
WorkflowDefinition::cast(inner).expect("workflow definition to cast"),
)),
_ => None,
}
}
pub fn inner(&self) -> &N {
match self {
Self::Import(e) => e.inner(),
Self::Struct(e) => e.inner(),
Self::Enum(e) => e.inner(),
Self::Task(e) => e.inner(),
Self::Workflow(e) => e.inner(),
}
}
pub fn as_import_statement(&self) -> Option<&ImportStatement<N>> {
match self {
Self::Import(i) => Some(i),
_ => None,
}
}
pub fn into_import_statement(self) -> Option<ImportStatement<N>> {
match self {
Self::Import(i) => Some(i),
_ => None,
}
}
pub fn as_struct_definition(&self) -> Option<&StructDefinition<N>> {
match self {
Self::Struct(i) => Some(i),
_ => None,
}
}
pub fn into_struct_definition(self) -> Option<StructDefinition<N>> {
match self {
Self::Struct(i) => Some(i),
_ => None,
}
}
pub fn as_enum_definition(&self) -> Option<&EnumDefinition<N>> {
match self {
Self::Enum(i) => Some(i),
_ => None,
}
}
pub fn into_enum_definition(self) -> Option<EnumDefinition<N>> {
match self {
Self::Enum(i) => Some(i),
_ => None,
}
}
pub fn as_task_definition(&self) -> Option<&TaskDefinition<N>> {
match self {
Self::Task(i) => Some(i),
_ => None,
}
}
pub fn into_task_definition(self) -> Option<TaskDefinition<N>> {
match self {
Self::Task(i) => Some(i),
_ => None,
}
}
pub fn as_workflow_definition(&self) -> Option<&WorkflowDefinition<N>> {
match self {
Self::Workflow(i) => Some(i),
_ => None,
}
}
pub fn into_workflow_definition(self) -> Option<WorkflowDefinition<N>> {
match self {
Self::Workflow(i) => Some(i),
_ => None,
}
}
pub fn child(node: &N) -> Option<Self> {
node.children().find_map(Self::cast)
}
pub fn children(node: &N) -> impl Iterator<Item = Self> + use<'_, N> {
node.children().filter_map(Self::cast)
}
}