fluentci_ext/cache/
gcs.rs1use 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}