use super::{Requirement, TransactionBuilder, TransactionBuilderError};
use crate::types::block::output::{DelegationId, Output, OutputId};
pub(crate) fn is_delegation_with_id(output: &Output, delegation_id: &DelegationId, output_id: &OutputId) -> bool {
if let Output::Delegation(delegation) = output {
&delegation.delegation_id_non_null(output_id) == delegation_id
} else {
false
}
}
pub(crate) fn is_delegation_with_id_non_null(output: &Output, delegation_id: &DelegationId) -> bool {
if let Output::Delegation(delegation) = output {
delegation.delegation_id() == delegation_id
} else {
false
}
}
impl TransactionBuilder {
pub(crate) fn fulfill_delegation_requirement(
&mut self,
delegation_id: DelegationId,
) -> Result<(), TransactionBuilderError> {
if let Some(input) = self
.selected_inputs
.iter()
.find(|input| is_delegation_with_id(&input.output, &delegation_id, input.output_id()))
{
log::debug!(
"{delegation_id:?} requirement already fulfilled by {:?}",
input.output_id()
);
return Ok(());
}
if !self.allow_additional_input_selection {
return Err(TransactionBuilderError::AdditionalInputsRequired(
Requirement::Delegation(delegation_id),
));
}
let index = self
.available_inputs
.iter()
.position(|input| is_delegation_with_id(&input.output, &delegation_id, input.output_id()))
.ok_or(TransactionBuilderError::UnfulfillableRequirement(
Requirement::Delegation(delegation_id),
))?;
let input = self.available_inputs.swap_remove(index);
log::debug!("{delegation_id:?} requirement fulfilled by {:?}", input.output_id());
self.select_input(input)?;
Ok(())
}
}