1use std::fmt;
13
14use crate::error::{Error, Result};
15use crate::value::Value;
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
19pub struct PromiseId(pub u64);
20
21impl fmt::Display for PromiseId {
22 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23 write!(f, "p{}", self.0)
24 }
25}
26
27#[derive(Debug, Clone, PartialEq)]
29pub enum PromiseState {
30 Pending,
32 Resolved(Value),
34 Rejected(crate::error::Error),
36 Cancelled,
38}
39
40impl PromiseState {
41 pub fn is_settled(&self) -> bool {
43 !matches!(self, PromiseState::Pending)
44 }
45}
46
47#[derive(Debug, Clone, PartialEq)]
49pub struct PromiseRecord {
50 pub id: PromiseId,
52 pub state: PromiseState,
54 pub waiters: u32,
56 pub lane: u64,
58}
59
60impl PromiseRecord {
61 pub fn new(id: PromiseId, lane: u64) -> Self {
63 Self {
64 id,
65 state: PromiseState::Pending,
66 waiters: 0,
67 lane,
68 }
69 }
70
71 pub fn resolve(&mut self, value: Value) -> Result<()> {
73 match self.state {
74 PromiseState::Pending => {
75 self.state = PromiseState::Resolved(value);
76 Ok(())
77 }
78 _ => Err(Error::PromiseAlreadyResolved(self.id.0)),
79 }
80 }
81
82 pub fn reject(&mut self, error: crate::error::Error) -> Result<()> {
84 match self.state {
85 PromiseState::Pending => {
86 self.state = PromiseState::Rejected(error);
87 Ok(())
88 }
89 _ => Err(Error::PromiseAlreadyResolved(self.id.0)),
90 }
91 }
92
93 pub fn cancel(&mut self) -> Result<()> {
95 match self.state {
96 PromiseState::Pending => {
97 self.state = PromiseState::Cancelled;
98 Ok(())
99 }
100 _ => Err(Error::PromiseAlreadyResolved(self.id.0)),
101 }
102 }
103
104 pub fn value(&self) -> Result<Value> {
106 match &self.state {
107 PromiseState::Resolved(value) => Ok(value.clone()),
108 PromiseState::Pending => Err(Error::UnresolvablePromise(self.id.0)),
109 PromiseState::Rejected(error) => Err(error.clone()),
110 PromiseState::Cancelled => Err(Error::PromiseCancelled(self.id.0)),
111 }
112 }
113}