use serde::{Deserialize, Serialize};
use validator::Validate;
use super::rpc_response_context::RpcResponseContext;
use crate::validation::{validate_airdrop_amount, validate_pubkey};
#[derive(Debug, Serialize, Deserialize, Validate, PartialEq)]
pub struct RequestAirdropRequest {
#[validate(length(min = 1, message = "Pubkey cannot be empty"))]
#[validate(custom(function = validate_pubkey))]
pub pubkey: String,
#[validate(custom(function = validate_airdrop_amount))]
pub lamports: u64,
}
impl RequestAirdropRequest {
pub fn new(pubkey: String, lamports: u64) -> Self {
Self { pubkey, lamports }
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RequestAirdropResponse {
pub context: RpcResponseContext,
pub value: String,
}
impl RequestAirdropResponse {
pub fn new(slot: u64, signature: String) -> Self {
Self {
context: RpcResponseContext::new(slot),
value: signature,
}
}
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
#[test]
fn test_valid_request_deserialization() {
let json = json!({
"pubkey": "83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri",
"lamports": 1000000
});
let request: RequestAirdropRequest = serde_json::from_value(json).unwrap();
assert_eq!(
request.pubkey,
"83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri"
);
assert_eq!(request.lamports, 1000000);
}
#[test]
fn test_invalid_pubkey_validation() {
use crate::validation::validate_request;
let request = RequestAirdropRequest {
pubkey: "not-a-valid-base58-string!".to_string(),
lamports: 1000000,
};
let result = validate_request(request);
assert!(result.is_err());
}
#[test]
fn test_zero_lamports_validation() {
use crate::validation::validate_request;
let request = RequestAirdropRequest {
pubkey: "83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri".to_string(),
lamports: 0,
};
let result = validate_request(request);
assert!(result.is_err());
}
}