use solana_instruction::Instruction;
use solana_program_error::ProgramError;
use solana_pubkey::Pubkey;
use super::CreateInstBuilder;
use crate::{Domain, derive_subdomain, name_record::SNSNodeWithOwner};
#[derive(Debug)]
pub struct CreateSubdomainInstBuilder {
payer: Pubkey,
domain: SNSNodeWithOwner,
owner: Option<Pubkey>,
class: Option<Pubkey>,
name: String,
space: Option<u32>,
}
impl CreateSubdomainInstBuilder {
pub fn new(payer: Pubkey, domain: Domain, name: String) -> Self {
Self { domain: domain.into(), payer, owner: None, class: None, name, space: None }
}
pub fn owner(mut self, owner: Option<Pubkey>) -> Self {
self.owner = owner;
self
}
pub fn class(mut self, class: Option<Pubkey>) -> Self {
self.class = class;
self
}
pub fn space(mut self, space: Option<u32>) -> Self {
self.space = space;
self
}
pub fn build(self) -> Result<Instruction, ProgramError> {
let Self { domain: parent, payer, owner, class, name, space } = self;
let account = derive_subdomain(&parent.pda, class.as_ref(), &name);
let builder = CreateInstBuilder { payer, account, parent, owner, class, space };
builder.build()
}
}