variation/
variation.rs

1use anyhow::Result;
2use tracing::info;
3
4use rust_woocommerce::Attribute;
5use rust_woocommerce::ProductVariation;
6use rust_woocommerce::{ApiClient, Config};
7use rust_woocommerce::{Product, ProductType};
8
9#[tokio::main]
10async fn main() -> Result<()> {
11    tracing_subscriber::fmt::init();
12    let config = Config::new("woo.toml")?;
13    let client = ApiClient::new(&config)?;
14    let products = client.list_all::<Product>().await?;
15    let random_variable_id = products
16        .iter()
17        .find(|p| !p.variations.is_empty())
18        .map(|p| p.id)
19        .unwrap_or_default();
20    let variations = client
21        .list_all_subentities::<ProductVariation>(random_variable_id)
22        .await?;
23    info!(
24        "Got {} variations for product with id: {random_variable_id}",
25        variations.len()
26    );
27    let retrieved_variation: ProductVariation = client
28        .retrieve_subentity(
29            random_variable_id,
30            variations.first().map(|v| v.id).unwrap_or_default(),
31        )
32        .await?;
33    info!("Retrieved variation has sku: {}", retrieved_variation.sku);
34    let attribute = Attribute::builder()
35        .name("Test Attribute")
36        .option("Best")
37        .option("Test")
38        .variation()
39        .visible()
40        .build();
41    let new_variable_product = Product::builder()
42        .name("Test Product For Example")
43        .product_type(ProductType::Variable)
44        .featured()
45        .short_description("The most professional description")
46        .sku("product for test 42")
47        .regular_price("6969")
48        .manage_stock()
49        .stock_quantity(42)
50        .weight("50")
51        .dimensions("4", "3", "2")
52        .shipping_class("large")
53        .images("https://cs14.pikabu.ru/post_img/2021/06/27/7/1624794514137159585.jpg")
54        .attribute(attribute)
55        .build();
56    let created: Product = client.create(new_variable_product).await?;
57    info!("Create product {} with id: {}", created.name, created.id);
58
59    let variation = ProductVariation::builder()
60        .sku(format!("{} Best", created.sku))
61        .regular_price("6969")
62        .manage_stock()
63        .stock_quantity(96)
64        .weight("52")
65        .dimensions("5", "4", "3")
66        .attribute(None, "Test Attribute", "Best")
67        .build();
68    let batch_create_variation = vec![variation.clone()];
69    let created_variation: ProductVariation =
70        client.create_subentity(created.id, variation).await?;
71    info!(
72        "Variation {} created with price: {}",
73        created_variation.sku, created_variation.price
74    );
75    let update = ProductVariation::builder().regular_price("7000").build();
76    let updated_variation: ProductVariation = client
77        .update_subentity(created.id, created_variation.id, update)
78        .await?;
79    info!(
80        "Variation {} updated with price: {}",
81        updated_variation.sku, updated_variation.price
82    );
83    let deleted_variation: ProductVariation = client
84        .delete_subentity(created.id, updated_variation.id)
85        .await?;
86    info!("Variation {} deleted", deleted_variation.sku);
87    let batch_created_variation: Vec<ProductVariation> = client
88        .batch_create_subentity(created.id, batch_create_variation)
89        .await?;
90    let bcv_id = batch_created_variation
91        .first()
92        .map(|v| v.id)
93        .unwrap_or_default();
94    let batch_update_variation = vec![ProductVariation::builder()
95        .id(bcv_id)
96        .regular_price("777")
97        .build()];
98    let _batch_updated_variation: Vec<ProductVariation> = client
99        .batch_update_subentity(created.id, batch_update_variation)
100        .await?;
101    let _batch_deleted_variation: Vec<ProductVariation> = client
102        .batch_delete_subentity(created.id, vec![bcv_id])
103        .await?;
104    let deleted: Product = client.delete(created.id).await?;
105    info!("Product {} deleted", deleted.name);
106    Ok(())
107}