use orchard::pczt::{Updater, UpdaterError};
use crate::{Pczt, common::AnchorRequirement, orchard::ParseError};
impl super::Updater {
pub fn update_orchard_with<F>(self, f: F) -> Result<Self, OrchardError>
where
F: FnOnce(Updater<'_>) -> Result<(), UpdaterError>,
{
let Pczt {
global,
transparent,
sapling,
orchard,
ironwood,
} = self.pczt;
let anchor_requirement = AnchorRequirement::for_pre_authorization(global.tx_version);
let mut parsed = orchard
.into_parsed_with_version(
crate::orchard::orchard_bundle_version(&global)
.ok_or(OrchardError::UnsupportedConsensusBranchId)?,
anchor_requirement,
)
.map_err(OrchardError::Parser)?;
parsed
.bundle
.update_with(f)
.map_err(OrchardError::Updater)?;
Ok(Self {
pczt: Pczt {
global,
transparent,
sapling,
orchard: parsed.reserialize(),
ironwood,
},
})
}
pub fn update_ironwood_with<F>(self, f: F) -> Result<Self, OrchardError>
where
F: FnOnce(Updater<'_>) -> Result<(), UpdaterError>,
{
let Pczt {
global,
transparent,
sapling,
orchard,
ironwood,
} = self.pczt;
let anchor_requirement = AnchorRequirement::for_pre_authorization(global.tx_version);
let mut parsed = ironwood
.into_ironwood_parsed(anchor_requirement)
.map_err(OrchardError::Parser)?;
parsed
.bundle
.update_with(f)
.map_err(OrchardError::Updater)?;
Ok(Self {
pczt: Pczt {
global,
transparent,
sapling,
orchard,
ironwood: parsed.reserialize(),
},
})
}
}
#[derive(Debug)]
pub enum OrchardError {
Parser(ParseError),
UnsupportedConsensusBranchId,
Updater(UpdaterError),
}