1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
use serde::{Deserialize, Serialize};
use crate::controllers::product_attributes::{
AttributeCreateBuilder, AttributeUpdateBuilder, NoName,
};
/// ```rust
/// #[cfg(test)]
/// mod tests {
/// use crate::{
/// product_attributes::{Attribute, AttributeSortOrder},
/// ApiClient, BatchObject, Entity,
/// };
///
/// #[tokio::test]
/// async fn test_list_all_attributes() {
/// let client = ApiClient::from_env().unwrap();
/// let result = client
/// .list_all::<Attribute>(Entity::ProductAttribute)
/// .await
/// .unwrap();
/// assert!(!result.is_empty());
/// }
/// #[tokio::test]
/// async fn test_retrieve_attribute() {
/// let client = ApiClient::from_env().unwrap();
/// let result = client
/// .retrieve::<Attribute>(Entity::ProductAttribute, 4)
/// .await
/// .unwrap();
/// assert_eq!("Цвет", result.name);
/// }
/// #[tokio::test]
/// async fn test_create_attribute() {
/// let client = ApiClient::from_env().unwrap();
/// let create = Attribute::create()
/// .name("test attribute")
/// .enable_archives()
/// .build();
/// let created = client
/// .create::<Attribute>(Entity::ProductAttribute, create)
/// .await
/// .unwrap();
/// assert_eq!(created.name, "test attribute");
/// let _deleted: Attribute = client
/// .delete(Entity::ProductAttribute, created.id)
/// .await
/// .unwrap();
/// }
/// #[tokio::test]
/// async fn test_update_attribute() {
/// let client = ApiClient::from_env().unwrap();
/// let update = Attribute::update()
/// .order_by(AttributeSortOrder::Name)
/// .build();
/// let updated = client
/// .update::<Attribute>(Entity::ProductAttribute, 2, update)
/// .await
/// .unwrap();
/// assert_eq!(updated.order_by, AttributeSortOrder::Name)
/// }
/// #[tokio::test]
/// async fn test_batch_update_attribute() {
/// let client = ApiClient::from_env().unwrap();
/// let update = Attribute::update()
/// .id(2)
/// .order_by(AttributeSortOrder::Name)
/// .build();
/// let batch = BatchObject::builder().add_update(update).build();
/// let updated: BatchObject<Attribute> = client
/// .batch_update(Entity::ProductAttribute, batch)
/// .await
/// .unwrap();
/// assert!(updated.update.is_some());
/// }
/// }
/// ```
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Attribute {
/// Unique identifier for the resource.
pub id: i32,
/// Attribute name.
pub name: String,
/// An alphanumeric identifier for the resource unique to its type.
pub slug: String,
/// Type of attribute. By default only select is supported.
#[serde(rename = "type")]
pub attribute_type: AttributeType,
/// Default sort order. Options: menu_order, name, name_num and id. Default is menu_order.
pub order_by: AttributeSortOrder,
/// Enable/Disable attribute archives. Default is false.
pub has_archives: bool,
}
impl Attribute {
pub fn create() -> AttributeCreateBuilder<NoName> {
AttributeCreateBuilder::default()
}
pub fn update() -> AttributeUpdateBuilder {
AttributeUpdateBuilder::default()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum AttributeType {
#[default]
Select,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AttributeSortOrder {
#[default]
MenuOrder,
Name,
NameNum,
Id,
}