tweet.rs (1480B)
1 use clap::ArgMatches; 2 3 use std::fs::OpenOptions; 4 use std::io::prelude::*; 5 use std::path::Path; 6 use std::process::Command; 7 8 use crate::config::Config; 9 use crate::entry::Entry; 10 11 /// Helper to run the tweet subcommand. 12 pub fn tweet(config: &Config, subcommand: &ArgMatches) { 13 // Parse tweet content. 14 let content = subcommand 15 .args 16 .get("content") 17 .and_then(|matched_arg| { 18 Some( 19 matched_arg 20 .vals 21 .iter() 22 .map(|os_string| os_string.clone().into_string().unwrap()) 23 .collect::<Vec<String>>() 24 .join(" "), 25 ) 26 }) 27 .unwrap_or_default(); 28 29 if content == "" { 30 eprintln!("Error: post content must not be empty"); 31 } else { 32 // Run pre tweet hook. 33 Command::new("sh") 34 .args(&["-c", &config.pre_tweet_hook]) 35 .output() 36 .expect("Failed to run pre tweet hook"); 37 38 // Write tweet. 39 OpenOptions::new() 40 .append(true) 41 .create(true) 42 .open(Path::new(&config.twtfile)) 43 .unwrap() 44 .write(Entry::new(content, None).to_twtxt().as_bytes()) 45 .expect("Unable to write new post"); 46 47 // Run post tweet hook. 48 Command::new("sh") 49 .args(&["-c", &config.post_tweet_hook]) 50 .output() 51 .expect("Failed to run post tweet hook"); 52 } 53 }