use crate::Pos;
use crate::ast::{Expr, Literal, Ref, SignClause};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct ReportWriter {
pub reports: Vec<Report>,
pub uses: Vec<UseBeforeReporting>,
pub procedure_start: usize,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Report {
pub name: String,
pub code: Option<Literal>,
pub controls: Vec<Ref>,
pub page: Option<u32>,
pub heading: Option<u32>,
pub first_detail: Option<u32>,
pub last_detail: Option<u32>,
pub footing: Option<Footing>,
pub line_limit: Option<u32>,
pub groups: Vec<Group>,
pub pos: Pos,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Footing {
Line(u32),
Plus(u32),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ControlName {
Final,
Item(Ref),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum GroupType {
ReportHeading,
PageHeading,
ControlHeading(Option<ControlName>),
Detail,
ControlFooting(Option<ControlName>),
PageFooting,
ReportFooting,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NextGroup {
Line(u32),
Plus(u32),
NextPage,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LineNumber {
Line(u32),
Plus(u32),
NextPage(Option<u32>),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ColumnNumber {
Left(u32),
Plus(u32),
Right(u32),
Center(u32),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SumClause {
pub operands: Vec<Ref>,
pub upon: Vec<Ref>,
pub reset: Option<ControlName>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Content {
Source(Expr),
Value(Literal),
Sum(Vec<SumClause>),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Group {
pub name: Option<String>,
pub kind: GroupType,
pub next_group: Option<NextGroup>,
pub entries: Vec<Entry>,
pub pos: Pos,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Entry {
pub level: u8,
pub name: Option<String>,
pub line: Option<LineNumber>,
pub column: Option<ColumnNumber>,
pub picture: Option<String>,
pub content: Option<Content>,
pub rounded: bool,
pub group_indicate: bool,
pub blank_when_zero: bool,
pub justified: bool,
pub sign: Option<SignClause>,
pub pos: Pos,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ReportStmt {
Initiate { reports: Vec<String>, pos: Pos },
Generate { name: String, qualifier: Option<String>, pos: Pos },
Terminate { reports: Vec<String>, pos: Pos },
Suppress { pos: Pos },
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UseBeforeReporting {
pub section: usize,
pub group: String,
pub qualifier: Option<String>,
pub global: bool,
pub pos: Pos,
}