1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
use crate::types::MessageValue;
use extended_primitives::Buffer;
pub struct StratumRequest<State> {
pub(crate) state: State,
// pub(crate) values: serde_json::map::Map<String, serde_json::Value>,
pub(crate) values: MessageValue,
}
impl<State> StratumRequest<State> {
/// Access application scoped state.
pub fn state(&self) -> &State {
&self.state
}
// //@todo maybe just kill these.
// pub fn get_stratum_v1_value(&self, name: &str) -> Option<&serde_json::Value> {
// match &self.values {
// MessageValue::StratumV1(value) => value.get(name),
// MessageValue::ExMessage(_) => None,
// }
// }
pub fn get_ex_message(&self) -> Option<Buffer> {
match &self.values {
MessageValue::StratumV1(_) => None,
MessageValue::ExMessage(value) => Some(value.body.clone()),
}
}
// //@todo this should actually return either I think.
// pub fn get(&self, name: &str) -> Option<&serde_json::Value> {
// match self.values {
// MessageValue::StratumV1(value) => value.get(name),
// MessageValue::ExMessage(_) => None,
// }
// }
pub fn get_json<T: serde::de::DeserializeOwned>(
&self,
name: &str,
) -> Result<T, serde_json::Error> {
match &self.values {
//@todo switch up these names for clarity too many value
MessageValue::StratumV1(value) => {
let value = value
.get(name)
.ok_or_else(|| serde::de::Error::custom(format!("expected {}", name)))?
.clone();
Ok(serde_json::from_value(value)?)
}
MessageValue::ExMessage(_) => Err(serde::de::Error::custom(format!(
"wrong message type request"
))),
}
}
}