1use anchor_lang::prelude::*;
2use borsh::{BorshDeserialize, BorshSerialize};
3pub mod consts;
4pub mod error;
5pub mod helper;
6use consts::*;
7use error::*;
8use helper::validate_name;
9
10type NAME = [u8; MAX_SIZE as usize];
11
12declare_id!("HVHcFNLzZK8FsaQ9CVY2TCDKiRFtfdykY7hfca5ebsUy");
13
14#[program]
15pub mod sdk_agent {
16 use super::*;
17
18 pub fn register_client(ctx: Context<RegisterClient>, _client_name: String) -> Result<()> {
19 let client = &mut ctx.accounts.client.load_init()?;
20 client.owner = ctx.accounts.owner.to_account_info().key();
21 Ok(())
22 }
23
24 pub fn remove_client(_ctx: Context<DeleteClient>) -> Result<()> {
25 Ok(())
26 }
27
28 pub fn send_request(ctx: Context<SendRequest>, request: Request) -> Result<()> {
29 let s = request.name();
30
31 let name = String::from_utf8(s.to_vec()).unwrap();
32 if validate_name(&name.as_bytes()) == false {
33 return err!(AgentError::InvalidName);
34 }
35 let req = &mut ctx.accounts.request.load_init()?;
36 req.requester = ctx.accounts.owner.to_account_info().key();
37 req.request = request;
38 Ok(())
39 }
40}
41
42#[derive(Accounts)]
43pub struct RegisterClient<'info> {
44 #[account(mut)]
45 pub owner: Signer<'info>,
46
47 #[account(init, payer= owner, space=56,seeds= ["client".as_ref(), owner.key().as_ref()], bump)]
48 pub client: AccountLoader<'info, Client>,
49
50 pub system_program: Program<'info, System>,
51}
52
53#[derive(Accounts)]
54pub struct DeleteClient<'info> {
55 #[account(mut)]
56 pub owner: Signer<'info>,
57
58 #[account(mut,close=owner,seeds= ["client".as_ref(),owner.key().as_ref()],bump)]
59 pub client: AccountLoader<'info, Client>,
60
61 pub system_program: Program<'info, System>,
62}
63
64#[derive(Accounts)]
65pub struct SendRequest<'info> {
66 #[account(mut)]
67 pub owner: Signer<'info>,
68
69 #[account(mut,seeds= ["client".as_ref(), owner.key().as_ref()],bump)]
70 pub client: AccountLoader<'info, Client>,
71
72 #[account(init,payer = owner,space = 200, seeds= ["request".as_ref(),owner.key().as_ref(),client.key().as_ref()],bump)]
73 pub request: AccountLoader<'info, RequestData>,
74
75 pub system_program: Program<'info, System>,
76}
77
78#[account(zero_copy)]
81pub struct Client {
82 id: u64,
83 owner: Pubkey,
84 request_count: u64,
85}
86
87#[account(zero_copy)]
90pub struct RequestData {
91 id: u64,
92 client_id: u64,
93 requester: Pubkey,
94 request: Request,
95}
96
97#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone)]
98pub enum Request {
99 CreateBucket { name: [u8; 128] },
100 CreateFile { name: [u8; 128] },
101 WriteFile { name: [u8; 128], file_id: u8 },
102 CloseFile { name: [u8; 128], file_id: u8 },
103 DeleteFile { name: [u8; 128], file_id: u8 },
104 SetPosition { name: [u8; 128], file_id: u8 },
105 OpenFile { name: [u8; 128], file_id: u8 },
106 ReadFile { name: [u8; 128], file_id: u8 },
107}
108
109impl Request {
110 fn name(&self) -> NAME {
111 match self {
112 Request::CreateBucket { name } => *name,
113 Request::CreateFile { name } => *name,
114 Request::WriteFile { name, .. } => *name,
115 Request::DeleteFile { name, .. } => *name,
116 Request::CloseFile { name, .. } => *name,
117 Request::SetPosition { name, .. } => *name,
118 Request::OpenFile { name, .. } => *name,
119 Request::ReadFile { name, .. } => *name,
120 }
121 }
122}