pub use crate::alby::helpers::RequestError;
use crate::alby::helpers::{make_request, ErrorResponse, RequestArgs};
use chrono::{DateTime, Utc};
use std::collections::HashMap;
pub mod account {
use super::*;
#[derive(Debug, serde::Deserialize)]
pub struct GetBalanceResponse {
pub balance: u64,
pub currency: String,
pub unit: String,
}
pub struct GetBalanceArgs<'a> {
pub user_agent: &'a str,
pub token: &'a str,
}
pub async fn get_balance(args: GetBalanceArgs<'_>) -> Result<GetBalanceResponse, RequestError> {
let request_args = RequestArgs {
user_agent: args.user_agent,
method: reqwest::Method::GET,
url: "https://api.getalby.com/balance",
token: args.token,
body: None,
};
make_request(request_args).await
}
}
pub mod invoices {
use super::*;
pub struct CreateInvoiceArgs<'a> {
pub user_agent: &'a str,
pub token: &'a str,
pub num_sats: u64,
pub metadata: serde_json::Value,
pub description: Option<String>,
pub payer_name: Option<String>,
}
#[derive(Debug, serde::Serialize)]
struct CreateInvoiceRequestBody {
#[serde(rename = "amount")]
pub num_sats: u64,
pub metadata: serde_json::Value,
pub description: Option<String>,
pub payer_name: Option<String>,
}
#[derive(Debug, serde::Deserialize)]
pub struct CreateInvoiceResponse {
pub expires_at: DateTime<Utc>,
pub payment_hash: String,
pub payment_request: String,
}
pub async fn create_invoice(
args: CreateInvoiceArgs<'_>,
) -> Result<CreateInvoiceResponse, RequestError> {
let request_body = CreateInvoiceRequestBody {
num_sats: args.num_sats,
metadata: args.metadata.clone(),
description: args.description.clone(),
payer_name: args.payer_name.clone(),
};
let body = serde_json::to_string(&request_body)
.map_err(|e| RequestError::Unexpected(e.to_string()))?;
let request_args = RequestArgs {
user_agent: args.user_agent,
method: reqwest::Method::POST,
url: "https://api.getalby.com/invoices",
token: args.token,
body: Some(&body),
};
make_request(request_args).await
}
}
pub mod payments {
use super::*;
pub struct KeysendArgs<'a> {
pub user_agent: &'a str,
pub token: &'a str,
pub num_sats: u64,
pub dest_pubkey: &'a str,
pub custom_records: HashMap<String, String>,
}
#[derive(Debug, serde::Serialize)]
struct KeysendRequest {
#[serde(rename = "amount")]
pub num_sats: u64,
#[serde(rename = "destination")]
pub dest_pubkey: String,
pub custom_records: HashMap<String, String>,
}
#[derive(Debug, serde::Deserialize, Default)]
pub struct KeysendResponse {
#[serde(rename = "amount")]
pub num_sats: u64,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub description_hash: Option<String>,
#[serde(rename = "destination")]
pub dest_pubkey: String,
#[serde(rename = "fee")]
pub fee_in_sats: u64,
pub custom_records: HashMap<String, String>,
pub payment_hash: String,
pub payment_preimage: String,
}
pub async fn keysend(args: KeysendArgs<'_>) -> Result<KeysendResponse, RequestError> {
let request_body = KeysendRequest {
num_sats: args.num_sats,
dest_pubkey: args.dest_pubkey.to_string(),
custom_records: args.custom_records.clone(),
};
let body = serde_json::to_string(&request_body)
.map_err(|e| RequestError::Unexpected(e.to_string()))?;
let request_args = RequestArgs {
user_agent: args.user_agent,
method: reqwest::Method::POST,
url: "https://api.getalby.com/payments/keysend",
token: args.token,
body: Some(&body),
};
make_request(request_args).await
}
#[derive(Debug, serde::Serialize)]
struct MultiKeysendRequest {
pub keysends: Vec<KeysendRequest>,
}
#[derive(Debug, serde::Deserialize)]
pub struct MultiKeysendItemResponse {
pub error: ErrorResponse,
pub keysend: KeysendResponse,
}
#[derive(Debug, serde::Deserialize)]
pub struct MultiKeysendResponse {
pub keysends: Vec<MultiKeysendItemResponse>,
}
pub struct MultiKeysendItemArgs<'a> {
pub num_sats: u64,
pub dest_pubkey: &'a str,
pub custom_records: HashMap<String, String>,
}
pub struct MultiKeysendArgs<'a> {
pub user_agent: &'a str,
pub token: &'a str,
pub keysends: Vec<MultiKeysendItemArgs<'a>>,
}
pub async fn multi_keysend(
args: MultiKeysendArgs<'_>,
) -> Result<MultiKeysendResponse, RequestError> {
let mut keysends = Vec::new();
for item in args.keysends.iter() {
let request = KeysendRequest {
num_sats: item.num_sats,
dest_pubkey: item.dest_pubkey.to_string(),
custom_records: item.custom_records.clone(),
};
keysends.push(request);
}
let request_body = MultiKeysendRequest { keysends };
let body = serde_json::to_string(&request_body)
.map_err(|e| RequestError::Unexpected(e.to_string()))?;
let request_args = RequestArgs {
user_agent: args.user_agent,
method: reqwest::Method::POST,
url: "https://api.getalby.com/payments/keysend/multi",
token: args.token,
body: Some(&body),
};
make_request(request_args).await
}
}