use super::{Requirement, TransactionBuilder, TransactionBuilderError};
use crate::types::block::output::{NftId, Output, OutputId};
pub(crate) fn is_nft_with_id(output: &Output, nft_id: &NftId, output_id: &OutputId) -> bool {
if let Output::Nft(nft) = output {
&nft.nft_id_non_null(output_id) == nft_id
} else {
false
}
}
pub(crate) fn is_nft_with_id_non_null(output: &Output, nft_id: &NftId) -> bool {
if let Output::Nft(nft) = output {
nft.nft_id() == nft_id
} else {
false
}
}
impl TransactionBuilder {
pub(crate) fn fulfill_nft_requirement(&mut self, nft_id: NftId) -> Result<(), TransactionBuilderError> {
if let Some(input) = self
.selected_inputs
.iter()
.find(|input| is_nft_with_id(&input.output, &nft_id, input.output_id()))
{
log::debug!("{nft_id:?} requirement already fulfilled by {:?}", input.output_id());
return Ok(());
}
if !self.allow_additional_input_selection {
return Err(TransactionBuilderError::AdditionalInputsRequired(Requirement::Nft(
nft_id,
)));
}
let index = self
.available_inputs
.iter()
.position(|input| is_nft_with_id(&input.output, &nft_id, input.output_id()))
.ok_or(TransactionBuilderError::UnfulfillableRequirement(Requirement::Nft(
nft_id,
)))?;
let input = self.available_inputs.swap_remove(index);
log::debug!("{nft_id:?} requirement fulfilled by {:?}", input.output_id());
self.select_input(input)?;
Ok(())
}
}