sugar_cli/validate/
parser.rs1use std::str::FromStr;
2
3use anchor_lang::prelude::Pubkey;
4pub use mpl_token_metadata::state::{MAX_NAME_LENGTH, MAX_SYMBOL_LENGTH, MAX_URI_LENGTH};
5
6use crate::{
7 common::*,
8 validate::{errors::ValidateParserError, Creator},
9};
10
11pub fn check_name(name: &str) -> Result<(), ValidateParserError> {
12 if name.len() > MAX_NAME_LENGTH {
13 return Err(ValidateParserError::NameTooLong);
14 }
15 Ok(())
16}
17
18pub fn check_symbol(symbol: &str) -> Result<(), ValidateParserError> {
19 if symbol.len() > MAX_SYMBOL_LENGTH {
20 return Err(ValidateParserError::SymbolTooLong);
21 }
22 Ok(())
23}
24
25pub fn check_url(url: &str) -> Result<(), ValidateParserError> {
26 if url.len() > MAX_URI_LENGTH {
27 return Err(ValidateParserError::UrlTooLong);
28 }
29 Ok(())
30}
31
32pub fn check_seller_fee_basis_points(
33 seller_fee_basis_points: u16,
34) -> Result<(), ValidateParserError> {
35 if seller_fee_basis_points > 10000 {
36 return Err(ValidateParserError::InvalidSellerFeeBasisPoints(
37 seller_fee_basis_points,
38 ));
39 }
40 Ok(())
41}
42
43pub fn check_creators_shares(creators: &[Creator]) -> Result<(), ValidateParserError> {
44 let mut shares = 0;
45 for creator in creators {
46 shares += creator.share;
47 }
48
49 if shares != 100 {
50 return Err(ValidateParserError::InvalidCreatorShare);
51 }
52 Ok(())
53}
54
55pub fn check_creators_addresses(creators: &[Creator]) -> Result<(), ValidateParserError> {
56 for creator in creators {
57 Pubkey::from_str(&creator.address)
58 .map_err(|_| ValidateParserError::InvalidCreatorAddress(creator.address.clone()))?;
59 }
60
61 Ok(())
62}
63
64pub fn check_category(category: &str) -> Result<(), ValidateParserError> {
65 if !VALID_CATEGORIES.contains(&category) {
66 return Err(ValidateParserError::InvalidCategory(
67 category.to_string(),
68 format!("{:?}", VALID_CATEGORIES),
69 ));
70 }
71
72 Ok(())
73}