use super::{Requirement, TransactionBuilder, TransactionBuilderError};
use crate::types::block::output::{FoundryId, Output};
pub(crate) fn is_foundry_with_id(output: &Output, foundry_id: &FoundryId) -> bool {
if let Output::Foundry(foundry) = output {
&foundry.id() == foundry_id
} else {
false
}
}
impl TransactionBuilder {
pub(crate) fn fulfill_foundry_requirement(&mut self, foundry_id: FoundryId) -> Result<(), TransactionBuilderError> {
if let Some(input) = self
.selected_inputs
.iter()
.find(|input| is_foundry_with_id(&input.output, &foundry_id))
{
log::debug!(
"{foundry_id:?} requirement already fulfilled by {:?}",
input.output_id()
);
return Ok(());
}
if !self.allow_additional_input_selection {
return Err(TransactionBuilderError::AdditionalInputsRequired(Requirement::Foundry(
foundry_id,
)));
}
let index = self
.available_inputs
.iter()
.position(|input| is_foundry_with_id(&input.output, &foundry_id))
.ok_or(TransactionBuilderError::UnfulfillableRequirement(Requirement::Foundry(
foundry_id,
)))?;
let input = self.available_inputs.swap_remove(index);
log::debug!("{foundry_id:?} requirement fulfilled by {:?}", input.output_id());
self.select_input(input)?;
Ok(())
}
}