rl_model/model/
postcondition.rs

1use super::*;
2use crate::parser::*;
3use std::collections::HashMap;
4
5#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash, Default)]
6pub struct PostconditionId(pub usize);
7impl Id for PostconditionId {
8    fn index(&self) -> usize {
9        self.0
10    }
11}
12
13#[derive(Debug, Clone)]
14pub struct Postcondition {
15    id: PostconditionId,
16    name: String,
17    expr: Expr,
18    position: Option<Position>,
19}
20
21impl Postcondition {
22    pub fn new<S: Into<String>>(name: S, expr: Expr, position: Option<Position>) -> Self {
23        let id = PostconditionId::default();
24        let name = name.into();
25        Self {
26            id,
27            name,
28            expr,
29            position,
30        }
31    }
32
33    pub fn expr(&self) -> &Expr {
34        &self.expr
35    }
36
37    //---------- Resolve ----------
38
39    pub fn resolve_resource(&mut self, map: &HashMap<String, ResourceId>) -> Result<(), RlError> {
40        self.expr.resolve_resource(map)
41    }
42
43    pub fn resolve_state(&mut self, map: &HashMap<String, StateId>) -> Result<(), RlError> {
44        self.expr.resolve_state(map)
45    }
46}
47
48impl Named<PostconditionId> for Postcondition {
49    fn id(&self) -> PostconditionId {
50        self.id
51    }
52
53    fn set_id(&mut self, id: PostconditionId) {
54        self.id = id;
55    }
56
57    fn name(&self) -> &str {
58        &self.name
59    }
60
61    fn position(&self) -> Option<Position> {
62        self.position.clone()
63    }
64}
65
66impl ToLang for Postcondition {
67    fn to_lang(&self, skillset: &Skillset) -> String {
68        format!("{}: {}", self.name, self.expr.to_lang(skillset))
69    }
70}
71
72impl std::fmt::Display for Postcondition {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        write!(f, "{}", self.name)
75    }
76}