use derive_more::{Constructor, Deref, Into};
use serde::{Deserialize, Serialize};
use solana_pubkey::Pubkey;
use crate::{
SNSNode, SOL_TLD_ADDRESS, SOL_TLD_OWNER_ADDRESS_MAINNET, derive_domain, derive_subdomain,
derive_tld,
instruction_builder::{CreateDomainInstBuilder, CreateSubdomainInstBuilder},
};
#[derive(Debug, Clone, Copy, Default, Constructor, Serialize, Deserialize)]
pub struct SNSNodeWithOwner {
pub pda: Pubkey,
pub owner: Pubkey,
}
#[derive(Debug, Clone, Copy, Default, Deref, Into)]
pub struct TLDomain(SNSNodeWithOwner);
impl TLDomain {
pub fn new(pda: Pubkey, owner: Pubkey) -> Self {
Self(SNSNodeWithOwner::new(pda, owner))
}
pub fn derive_new(owner: Pubkey, class: Option<&Pubkey>, name: &str) -> Self {
let SNSNode { pda, .. } = derive_tld(class, name);
Self(SNSNodeWithOwner::new(pda, owner))
}
pub fn sol_mainnet() -> Self {
Self(SNSNodeWithOwner::new(SOL_TLD_ADDRESS, SOL_TLD_OWNER_ADDRESS_MAINNET))
}
pub fn sol_devnet() -> Self {
let owner = Pubkey::default();
Self(SNSNodeWithOwner::new(SOL_TLD_ADDRESS, owner))
}
}
#[derive(Debug, Clone, Copy, Deref, Into)]
pub struct Domain(SNSNodeWithOwner);
impl Domain {
pub fn new(pda: Pubkey, owner: Pubkey) -> Self {
Self(SNSNodeWithOwner::new(pda, owner))
}
pub fn derive_new(parent: &Pubkey, owner: Pubkey, class: Option<&Pubkey>, name: &str) -> Self {
let SNSNode { pda, .. } = derive_domain(parent, class, name);
Self::new(pda, owner)
}
pub fn create_instruction_builder(
payer: Pubkey,
tld: TLDomain,
name: &str,
) -> CreateDomainInstBuilder {
CreateDomainInstBuilder::new(payer, tld, String::from(name))
}
}
#[derive(Debug, Clone, Copy, Deref, Into)]
pub struct Subdomain(SNSNodeWithOwner);
impl Subdomain {
pub fn new(pda: Pubkey, owner: Pubkey) -> Self {
Self(SNSNodeWithOwner::new(pda, owner))
}
pub fn derive_new(parent: &Pubkey, owner: Pubkey, class: Option<&Pubkey>, name: &str) -> Self {
let SNSNode { pda, .. } = derive_subdomain(parent, class, name);
Self::new(pda, owner)
}
pub fn create_instruction_builder(
payer: Pubkey,
domain: Domain,
name: &str,
) -> CreateSubdomainInstBuilder {
CreateSubdomainInstBuilder::new(payer, domain, String::from(name))
}
}