pub(crate) mod limits;
mod result;
mod rule_set;
mod tracing;
use crate::error::{ParseError, RuleAttemptCursorError, RunError, RunStartError};
use crate::execution::{
BorrowedRuleAttemptSession, BorrowedRunSession, OwnedRuleAttemptSession, OwnedRunSession,
RuleAttemptSeed,
};
use crate::input::RunSeed;
use crate::inspect::{OnceRuleCount, RuleCount, RuleView};
use crate::limits::ParseLimits;
use crate::parser::parse_rules_impl;
use crate::rule::Rule;
use crate::source::ProgramSource;
pub(crate) use rule_set::{ActiveRuleCursor, RuleCursor, RuleCursorAfterMiss, RuleTarget};
pub(crate) use rule_set::{RuleSet, RuleSetBuilder};
pub use result::{ReturnOutput, ReturnOutputView, RunOutcome, RunResult, RuntimeStateSnapshot};
pub struct Program {
rule_set: RuleSet,
}
impl core::fmt::Debug for Program {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter
.debug_struct("Program")
.field("rule_count", &self.rule_count())
.field("once_rule_count", &self.once_rule_count())
.finish()
}
}
impl Program {
pub(crate) fn from_rule_set(rule_set: RuleSet) -> Self {
Self { rule_set }
}
pub fn parse(source: ProgramSource<'_>, limits: ParseLimits) -> Result<Self, ParseError> {
Ok(Self::from_rule_set(parse_rules_impl(source, limits)?))
}
#[must_use]
pub fn rule_count(&self) -> RuleCount {
self.rule_set.rule_count()
}
#[must_use]
pub fn once_rule_count(&self) -> OnceRuleCount {
self.rule_set.once_rule_count()
}
pub fn rules(&self) -> impl Iterator<Item = RuleView<'_>> + '_ {
self.rule_set.as_slice().iter().map(RuleView::new)
}
pub(crate) fn rule_slice(&self) -> &[Rule] {
self.rule_set.as_slice()
}
pub fn start_run(&self, seed: RunSeed) -> Result<BorrowedRunSession<'_>, RunStartError> {
BorrowedRunSession::new(self, seed)
}
pub fn into_run(self, seed: RunSeed) -> Result<OwnedRunSession, RunStartError> {
OwnedRunSession::new(self, seed)
}
pub fn start_rule_attempt_run(
&self,
seed: RuleAttemptSeed,
) -> Result<BorrowedRuleAttemptSession<'_>, RunStartError> {
BorrowedRuleAttemptSession::new(self, seed)
}
pub fn into_rule_attempt_run(
self,
seed: RuleAttemptSeed,
) -> Result<OwnedRuleAttemptSession, RunStartError> {
OwnedRuleAttemptSession::new(self, seed)
}
pub fn run(&self, seed: RunSeed) -> Result<RunResult, RunError> {
crate::execution::finish_borrowed_run(self, seed)
}
pub(crate) fn rule_attempt_cursor(&self) -> RuleCursor {
self.rule_set.rule_attempt_cursor()
}
pub(crate) fn target_for_cursor(
&self,
cursor: ActiveRuleCursor,
) -> Result<RuleTarget<'_>, RuleAttemptCursorError> {
self.rule_set.target_for_cursor(cursor)
}
}