fluentci_ext/cache/
gcs.rs

1use std::{env, fs};
2
3use anyhow::Error;
4use async_trait::async_trait;
5use cloud_storage::Client;
6use mime_guess::MimeGuess;
7use owo_colors::OwoColorize;
8
9use super::CacheBackend;
10
11pub struct GoogleCloudStorage {
12    client: Client,
13    prefix: String,
14}
15
16pub async fn new() -> Result<GoogleCloudStorage, Error> {
17    let client = Client::default();
18    let prefix = format!("{}/{}", env::consts::OS, env::consts::ARCH);
19    Ok(GoogleCloudStorage { client, prefix })
20}
21
22#[async_trait]
23impl CacheBackend for GoogleCloudStorage {
24    async fn restore(&self, path: &str) -> Result<(), Error> {
25        let filename = path.split("/").last().unwrap();
26        let object = format!("{}/{}", self.prefix, filename);
27        let bucket = env::var("FLUENTCI_CACHE_GCS_BUCKET")?;
28        match self.client.object().download(&bucket, &object).await {
29            Ok(data) => {
30                fs::write(path, data)?;
31            }
32            Err(_) => println!("{} Cache not found for key: {}", "[gcs]".cyan(), object),
33        };
34
35        Ok(())
36    }
37
38    async fn save(&self, path: &str) -> Result<(), Error> {
39        let name = path.split("/").last().unwrap();
40        let name = format!("{}/{}", self.prefix, name);
41
42        let data = fs::read(path)?;
43        let bucket = env::var("FLUENTCI_CACHE_GCS_BUCKET")?;
44        let mime_type = MimeGuess::from_path(path).first_or_octet_stream();
45
46        self.client
47            .object()
48            .create(&bucket, data, &name, &mime_type.to_string())
49            .await?;
50
51        Ok(())
52    }
53}