use syn::{Expr, Ident, Path, ReturnType, Type, Visibility};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ToolDefinitionIr {
pub visibility: Visibility,
pub trait_ident: Ident,
pub version: Option<String>,
pub requires_filesystem: bool,
pub aliases: Vec<String>,
pub doc: DocIr,
pub commands: Vec<CommandIr>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CommandIr {
pub method_ident: Ident,
pub doc: DocIr,
pub aliases: Vec<String>,
pub name_override: Option<String>,
pub annotations: Option<CommandAnnotationsIr>,
pub subtree: Option<SubtreeIr>,
pub is_async: bool,
pub params: Vec<ParamIr>,
pub output: ReturnType,
pub args: Vec<ArgIr>,
pub constraints: Vec<ConstraintIr>,
pub result: Option<ResultIr>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParamIr {
pub ident: Ident,
pub ty: Type,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SubtreeIr {
pub path: Path,
pub name_override: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct CommandAnnotationsIr {
pub read_only: Option<bool>,
pub destructive: Option<bool>,
pub idempotent: Option<bool>,
pub open_world: Option<bool>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ArgPlacement {
RootGlobal,
Global,
Positional,
Option,
Flag,
Tail,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ArgSubKind {
Flag,
CountFlag,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RepeatableMode {
Repeated,
Delimited,
Either,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PathKindIr {
File,
Directory,
Any,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PathDirectionIr {
Input,
Output,
InOut,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OutputChannelIr {
Stdout,
Stderr,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ArgIr {
pub param: Ident,
pub placement: Option<ArgPlacement>,
pub sub_kind: Option<ArgSubKind>,
pub short: Option<char>,
pub aliases: Vec<String>,
pub env: Option<String>,
pub required: Option<bool>,
pub negatable: Option<bool>,
pub optional_scalar: bool,
pub repeatable: Option<RepeatableMode>,
pub delim: Option<char>,
pub default: Option<Expr>,
pub separator: Option<String>,
pub verbatim: bool,
pub accepts_stdio: bool,
pub regex: Option<String>,
pub min_length: Option<u32>,
pub max_length: Option<u32>,
pub path_kind: Option<PathKindIr>,
pub direction: Option<PathDirectionIr>,
pub mime: Option<Vec<String>>,
pub extensions: Option<Vec<String>>,
pub output_channel: Option<OutputChannelIr>,
pub schemes: Option<Vec<String>>,
pub raw_min: Option<Expr>,
pub raw_max: Option<Expr>,
pub bounds: Option<(Expr, Expr)>,
pub unit: Option<String>,
pub doc: Option<String>,
pub description: Option<String>,
pub value_name: Option<String>,
}
impl ArgIr {
pub fn new(param: Ident) -> Self {
ArgIr {
param,
placement: None,
sub_kind: None,
short: None,
aliases: Vec::new(),
env: None,
required: None,
negatable: None,
optional_scalar: false,
repeatable: None,
delim: None,
default: None,
separator: None,
verbatim: false,
accepts_stdio: false,
regex: None,
min_length: None,
max_length: None,
path_kind: None,
direction: None,
mime: None,
extensions: None,
output_channel: None,
schemes: None,
raw_min: None,
raw_max: None,
bounds: None,
unit: None,
doc: None,
description: None,
value_name: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QuantifierIr {
All,
Any,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RefIr {
Present(String),
ValueIs { name: String, value: Box<Expr> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConstraintIr {
RequiresAll(Vec<RefIr>),
AllOrNone(Vec<RefIr>),
RequiresAny(Vec<RefIr>),
MutexGroups(Vec<Vec<RefIr>>),
Implies {
lhs_quant: QuantifierIr,
lhs: Vec<RefIr>,
rhs_quant: QuantifierIr,
rhs: Vec<RefIr>,
},
Forbids {
lhs_quant: QuantifierIr,
lhs: Vec<RefIr>,
rhs: Vec<RefIr>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FormatterIr {
pub name: String,
pub doc: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct ResultIr {
pub formatters: Vec<FormatterIr>,
pub default_formatter: Option<String>,
pub doc: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct DocIr {
pub summary: String,
pub description: String,
pub examples: Vec<ExampleIr>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExampleIr {
pub title: String,
pub body: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ToolErrorIr {
pub enum_ident: Ident,
pub variants: Vec<ToolErrorVariantIr>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorKindIr {
UsageError,
RuntimeError,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ToolErrorVariantIr {
pub variant_ident: Ident,
pub doc: DocIr,
pub kind: ErrorKindIr,
pub exit_code: u8,
pub payload: ToolErrorPayloadIr,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(clippy::large_enum_variant)]
pub enum ToolErrorPayloadIr {
None {
style: ToolErrorNoPayloadStyleIr,
},
Single {
ty: Type,
field_ident: Option<Ident>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ToolErrorNoPayloadStyleIr {
Unit,
Tuple,
Struct,
}