sdk_agent/
lib.rs

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// one client per one user
79// struct to store client information, such as id, owner and number of requests from that client
80#[account(zero_copy)]
81pub struct Client {
82    id: u64,
83    owner: Pubkey,
84    request_count: u64,
85}
86
87// Information about particular requests such as id,its client, requester,and request enum
88// for details about the request
89#[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}