use crate::encode::JsonSerializerStateError;
use crate::internal::JsonPrivateProtocolKind;
use crate::internal::JsonPrivateProtocolPhase;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct JsonPrivateProtocolState {
kind: JsonPrivateProtocolKind,
phase: JsonPrivateProtocolPhase,
}
impl JsonPrivateProtocolState {
pub(crate) fn new(kind: JsonPrivateProtocolKind, declared_len: usize) -> Result<Self, JsonSerializerStateError> {
if declared_len != 1 {
return Err(kind.invalid_state());
}
Ok(Self {
kind,
phase: JsonPrivateProtocolPhase::Pending,
})
}
pub(crate) fn begin(&mut self, field: &str) -> Result<(), JsonSerializerStateError> {
if self.phase != JsonPrivateProtocolPhase::Pending || field != self.kind.field_name() {
self.phase = JsonPrivateProtocolPhase::Failed;
return Err(self.kind.invalid_state());
}
self.phase = JsonPrivateProtocolPhase::InFlight;
Ok(())
}
pub(crate) fn complete(&mut self) -> Result<(), JsonSerializerStateError> {
if self.phase != JsonPrivateProtocolPhase::InFlight {
self.phase = JsonPrivateProtocolPhase::Failed;
return Err(self.kind.invalid_state());
}
self.phase = JsonPrivateProtocolPhase::Complete;
Ok(())
}
pub(crate) fn fail(&mut self) {
self.phase = JsonPrivateProtocolPhase::Failed;
}
pub(crate) fn finish(self) -> Result<(), JsonSerializerStateError> {
if self.phase == JsonPrivateProtocolPhase::Complete {
Ok(())
} else {
Err(self.kind.invalid_state())
}
}
}