+ /// Check that feature bits are set as required
+ fn check_feature_bits(&self) -> Result<(), SemanticError> {
+ // "If the payment_secret feature is set, MUST include exactly one s field."
+ let payment_secret_count = self.tagged_fields().filter(|&tf| match *tf {
+ TaggedField::PaymentSecret(_) => true,
+ _ => false,
+ }).count();
+ if payment_secret_count > 1 {
+ return Err(SemanticError::MultiplePaymentSecrets);
+ }
+
+ // "A writer MUST set an s field if and only if the payment_secret feature is set."
+ let has_payment_secret = payment_secret_count == 1;
+ let features = self.tagged_fields().find(|&tf| match *tf {
+ TaggedField::Features(_) => true,
+ _ => false,
+ });
+ match features {
+ None if has_payment_secret => Err(SemanticError::InvalidFeatures),
+ None => Ok(()),
+ Some(TaggedField::Features(features)) => {
+ if features.supports_payment_secret() && has_payment_secret {
+ Ok(())
+ } else if has_payment_secret {
+ Err(SemanticError::InvalidFeatures)
+ } else if features.supports_payment_secret() {
+ Err(SemanticError::InvalidFeatures)
+ } else {
+ Ok(())
+ }
+ },
+ Some(_) => unreachable!(),
+ }
+ }
+