lists3/
lib.rs

1#![allow(rustdoc::bare_urls)]
2#![doc = include_str!("../README.md")]
3
4use std;
5
6use aws_config::Region;
7
8mod templates;
9mod squire;
10mod aws;
11
12/// Generates the HTML file required with template.
13///
14/// # Arguments
15///
16/// * `config` - Configuration settings passed as flags or env vars.
17/// * `region` - Reference to the AWS region object.
18/// * `metadata` - Project's metadata information stored as a struct.
19///
20/// # Returns
21///
22/// Returns a `String` response of the HTML page.
23async fn generate_html(
24    config: &squire::settings::Config,
25    region: &Region,
26    metadata: &squire::constant::MetaData
27) -> String {
28    let jinja = templates::environment();
29    let template_string = format!("list-s3-{}", config.style);
30    let list_object = jinja.get_template(template_string.as_str()).unwrap();
31    let html_data = list_object.render(minijinja::context!(
32        bucket_name => config.bucket,
33        region_name => region.to_string(),
34        folder_names => config.filter,
35        ignore_objects => config.ignore,
36        proxy_server => config.proxy.to_string(),
37        cargo_version => metadata.pkg_version
38    ));
39    html_data.unwrap()
40}
41
42/// Initializes the application and uploads the generated HTML to S3.
43pub async fn initiate() {
44    let metadata = squire::constant::build_info();
45    let config = squire::parser::arguments(&metadata);
46
47    let region = aws::get_region(&config).await;
48    let aws_client = aws::get_client(&region).await;
49
50    let mut bucket_names = Vec::new();
51    match aws::get_buckets(&aws_client).await {
52        Some(buckets) => {
53            for bucket in buckets {
54                bucket_names.push(bucket.name.unwrap());
55            }
56        }
57        None => {
58            eprintln!("Failed to fetch S3 buckets.");
59            std::process::exit(1)
60        }
61    }
62    if !bucket_names.contains(&config.bucket) {
63        eprintln!("\n{:?}\n\tBucket name is invalid.\n\tExpected one of {:?}\n",
64                  &config.bucket, bucket_names);
65        std::process::exit(1)
66    }
67    let data = generate_html(&config, &region, &metadata).await;
68    aws::upload_object(&aws_client, &config.bucket, &data, &config.object).await;
69}