use sift_rs::{
Credentials, RetryConfig, RetryExt, SiftChannelBuilder,
wrappers::{
assets::{AssetServiceWrapper, new_asset_service},
ingestion_configs::{IngestionConfigServiceWrapper, new_ingestion_config_service},
},
};
use std::env;
use std::time::Duration;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let credentials = Credentials::Config {
apikey: env::var("SIFT_API_KEY").unwrap(),
uri: env::var("SIFT_URI").unwrap(),
};
let conn = SiftChannelBuilder::new(credentials).build()?;
println!("Example 1: Using default retry configuration");
example_default_retry(&conn).await?;
println!("\nExample 2: Using custom retry configuration");
example_custom_retry(&conn).await?;
println!("\nExample 3: Using retry with ingestion config service");
example_ingestion_config_retry(&conn).await?;
Ok(())
}
async fn example_default_retry(
conn: &sift_connect::SiftChannel,
) -> Result<(), Box<dyn std::error::Error>> {
let asset_service = new_asset_service(conn.clone());
let retrying_service = asset_service.retrying(RetryConfig::default());
let result = retrying_service
.call(|mut wrapper| async move {
wrapper.try_get_asset_by_id("example-asset-id").await
})
.await;
match result {
Ok(asset) => {
println!("Successfully retrieved asset: {}", asset.name);
}
Err(e) => {
println!("Failed to retrieve asset after retries: {}", e);
}
}
Ok(())
}
async fn example_custom_retry(
conn: &sift_connect::SiftChannel,
) -> Result<(), Box<dyn std::error::Error>> {
let asset_service = new_asset_service(conn.clone());
let custom_config = RetryConfig {
max_attempts: 5, base_delay: Duration::from_millis(200), max_delay: Duration::from_secs(10), backoff_multiplier: 1.5, };
let retrying_service = asset_service.retrying(custom_config);
let result = retrying_service
.call(|mut wrapper| async move {
let asset = wrapper.try_get_asset_by_id("example-asset-id").await?;
wrapper
.try_update_asset(asset, vec!["display_name".to_string()])
.await
})
.await;
match result {
Ok(asset) => {
println!("Successfully updated asset: {}", asset.name);
}
Err(e) => {
println!("Failed to update asset after retries: {}", e);
}
}
Ok(())
}
async fn example_ingestion_config_retry(
conn: &sift_connect::SiftChannel,
) -> Result<(), Box<dyn std::error::Error>> {
let ingestion_config_service = new_ingestion_config_service(conn.clone());
let retry_config = RetryConfig {
max_attempts: 4,
base_delay: Duration::from_millis(150),
max_delay: Duration::from_secs(3),
backoff_multiplier: 2.0,
};
let retrying_service = ingestion_config_service.retrying(retry_config);
let result = retrying_service
.call(|mut wrapper| async move {
wrapper
.try_get_ingestion_config_by_id("example-config-id")
.await
})
.await;
match result {
Ok(config) => {
println!(
"Successfully retrieved ingestion config: {}",
config.client_key
);
}
Err(e) => {
println!("Failed to retrieve ingestion config after retries: {}", e);
}
}
let result = retrying_service
.call(|mut wrapper| async move {
wrapper
.try_get_ingestion_config_by_client_key("example-client-key")
.await
})
.await;
match result {
Ok(config) => {
println!(
"Successfully retrieved ingestion config by client key: {}",
config.client_key
);
}
Err(e) => {
println!(
"Failed to retrieve ingestion config by client key after retries: {}",
e
);
}
}
Ok(())
}