about summary refs log tree commit diff
path: root/src/bin/kittybox_bulk_import.rs
blob: 652a4c29826d751451a4ab128151313354fcc007 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::io::{self, Read};
use std::fs::File;
use anyhow::{anyhow, Context, Result, bail};

#[async_std::main]
async fn main() -> Result<()> {
    let args = std::env::args().collect::<Vec<String>>();
    if args.iter().skip(1).any(|s| s == "--help") {
        println!("Usage: {} <url> [file]", args[0]);
        println!("\nIf launched with no arguments, reads from stdin.");
        println!("\nUse KITTYBOX_AUTH_TOKEN environment variable to authorize to the Micropub endpoint.");
        std::process::exit(0);
    }

    let token = std::env::var("KITTYBOX_AUTH_TOKEN").map_err(|_| anyhow!("No auth token found! Use KITTYBOX_AUTH_TOKEN env variable."))?;
    let data: Vec<serde_json::Value> = (if args.len() == 2 || (args.len() == 3 && args[2] == "-") {
        serde_json::from_reader(io::stdin())
    } else if args.len() == 3 {
        serde_json::from_reader(File::open(&args[2]).with_context(|| "Error opening input file")?)
    } else {
        bail!("See `{} --help` for usage.", args[0]);
    }).with_context(|| "Error while loading the input file")?;

    let url = surf::Url::parse(&args[1])?;
    let client = surf::Client::new();

    let mut iter = data.into_iter();

    while let Some(post) = iter.next() {
        println!("Processing {}...", post["properties"]["url"][0].as_str().or(post["properties"]["published"][0].as_str().or(post["properties"]["name"][0].as_str().or(Some("<unidentified post>")))).unwrap());
        match client.post(&url)
            .body(surf::http::Body::from_string(
                serde_json::to_string(&post)?))
            .header("Content-Type", "application/json")
            .header("Authorization", format!("Bearer {}", &token))
            .send().await {
            Ok(mut response) => {
                if response.status() == 201 || response.status() == 202 {
                    println!("Posted at {}", response.header("location").unwrap().last());
                } else {
                    println!("Error: {:?}", response.body_string().await);
                }
            }
            Err(err) => {
                println!("{}", err);
            }
        }
    }
    Ok(())
}