1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
use futures::future::err; use interledger_packet::{ErrorCode, MaxPacketAmountDetails, RejectBuilder}; use interledger_service::*; pub trait MaxPacketAmountAccount: Account { fn max_packet_amount(&self) -> u64; } pub struct MaxPacketAmountService<S> { next: S, } impl<S, A> IncomingService<A> for MaxPacketAmountService<S> where S: IncomingService<A>, A: MaxPacketAmountAccount, { type Future = BoxedIlpFuture; fn handle_request(&mut self, request: IncomingRequest<A>) -> Self::Future { let max_packet_amount = request.from.max_packet_amount(); if request.prepare.amount() <= max_packet_amount { Box::new(self.next.handle_request(request)) } else { let details = MaxPacketAmountDetails::new(request.prepare.amount(), max_packet_amount).to_bytes(); Box::new(err(RejectBuilder { code: ErrorCode::F08_AMOUNT_TOO_LARGE, message: &[], triggered_by: &[], data: &details[..], } .build())) } } }