1use std::{fmt::Display, str::FromStr};
4
5use bon::Builder;
6use url::Url;
7
8use crate::types::{AmountValue, AnyJson, Extension, OutputSchema, Record};
9
10pub trait NetworkFamily {
12 fn network_name(&self) -> &str;
14
15 fn network_id(&self) -> &str;
17}
18
19pub trait Address: FromStr + Display + Copy {
21 type Network: NetworkFamily;
23}
24
25pub trait Scheme {
27 type Network: NetworkFamily;
29 type Payload;
31 const SCHEME_NAME: &'static str;
33 fn network(&self) -> &Self::Network;
35}
36
37#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub struct Asset<A: Address> {
40 pub address: A,
41 pub decimals: u8,
42 pub name: &'static str,
43 pub symbol: &'static str,
44}
45
46#[derive(Builder)]
48pub struct Payment<S, A>
49where
50 S: Scheme,
51 A: Address<Network = S::Network>,
52{
53 pub scheme: S,
55 #[builder(into)]
57 pub pay_to: A,
58 #[builder(into)]
60 pub asset: Asset<A>,
61 #[builder(into)]
63 pub amount: AmountValue,
64 pub max_timeout_seconds: u64,
66 pub extra: Option<AnyJson>,
68}
69
70#[derive(Builder)]
74pub struct PaymentSelection<A: Address> {
75 #[builder(into)]
77 pub pay_to: A,
78 #[builder(into)]
80 pub asset: A,
81 #[builder(into)]
83 pub amount: AmountValue,
84 pub max_timeout_seconds: u64,
86 pub extra: Option<AnyJson>,
88 pub resource: Resource,
90 #[builder(default)]
92 pub extensions: Record<Extension>,
93}
94
95pub trait SchemeSigner<A: Address<Network = <Self::Scheme as Scheme>::Network>> {
97 type Scheme: Scheme;
98 type Error: std::error::Error;
99
100 fn sign(
101 &self,
102 payment: &PaymentSelection<A>,
103 ) -> impl Future<Output = Result<<Self::Scheme as Scheme>::Payload, Self::Error>>;
104}
105
106#[derive(Builder, Debug, Clone, PartialEq, Eq)]
108pub struct Resource {
109 pub url: Url,
111 #[builder(into)]
113 pub description: String,
114 #[builder(into)]
116 pub mime_type: String,
117 pub output_schema: Option<OutputSchema>,
119}