1use z3::{Context, Solver};
2use std::collections::HashMap;
3
4#[allow(dead_code)]
5pub struct ConstraintSolver<'ctx> {
6 solver: Solver<'ctx>,
7}
8
9impl<'ctx> ConstraintSolver<'ctx> {
10 #[allow(dead_code)]
11 pub fn new(context: &'ctx Context) -> Self {
12 let solver = Solver::new(context);
13 Self { solver }
14 }
15
16 #[allow(dead_code)]
17 pub fn add_lifetime_constraint(&mut self, constraint: LifetimeConstraint) {
18 match constraint {
20 LifetimeConstraint::Outlives { longer: _, shorter: _ } => {
21 }
23 LifetimeConstraint::MustBeValid { lifetime: _, point: _ } => {
24 }
26 }
27 }
28
29 #[allow(dead_code)]
30 pub fn solve(&self) -> Result<Solution, String> {
31 match self.solver.check() {
32 z3::SatResult::Sat => {
33 Ok(Solution {
35 lifetimes: HashMap::new(),
36 })
37 }
38 z3::SatResult::Unsat => {
39 Err("Lifetime constraints are unsatisfiable".to_string())
40 }
41 z3::SatResult::Unknown => {
42 Err("Could not determine satisfiability".to_string())
43 }
44 }
45 }
46}
47
48#[derive(Debug)]
49#[allow(dead_code)]
50pub enum LifetimeConstraint {
51 Outlives { longer: String, shorter: String },
52 MustBeValid { lifetime: String, point: usize },
53}
54
55#[derive(Debug)]
56#[allow(dead_code)]
57pub struct Solution {
58 pub lifetimes: HashMap<String, (usize, usize)>,
59}