rustfmt, rustdoc, Cargo.toml fixes

This commit is contained in:
nobody 2024-08-06 18:05:26 +02:00 committed by murmeldin
parent 81714dfdc0
commit 473d131246
6 changed files with 61 additions and 29 deletions

View file

@ -19,3 +19,4 @@ clap = "4.5.11"
rpassword = "7.3.1" rpassword = "7.3.1"
serde = {version = "1.0.204", features = ["derive"]} serde = {version = "1.0.204", features = ["derive"]}
serde_json = "1.0.122" serde_json = "1.0.122"
colored = "2.1.0"

View file

@ -17,15 +17,32 @@
//! and then in the main module, glue them all together and use them to populate defaults etc. //! and then in the main module, glue them all together and use them to populate defaults etc.
//! //!
//! ```rust //! ```rust
//! # mod modname {
//! # pub const CONFIG: CfgGroup<'static> = CfgGroup {
//! # name: "modname", // this will be the field name prefix in the KV store
//! # description: "what this module is for",
//! # fields: &[
//! # // full field name in the KV store will be `"modname-user"`
//! # CfgField::Default { key: "user", default: "xyzzy", description: "User name for someservice." },
//! # CfgField::Password { key: "password", description: "Password for someservice." },
//! # // also available: Optional, Generated, Silent
//! # ],
//! # };
//! # }
//! const CONFIG_SPEC: CfgSpec<'static> = CfgSpec { //! const CONFIG_SPEC: CfgSpec<'static> = CfgSpec {
//! groups: &[ //! groups: &[
//! modname::CONFIG, //! modname::CONFIG,
//! // etc. //! // etc.
//! ], //! ],
//! }; //! };
//! // open a config file somewhere (we use a dummy to not cause side-effects)
//! let config = KeyValueStore::new_dummy()?;
//! assert_eq!( config.get("modname-user").unwrap(), "xyzzy" );
//! // always: //! // always:
//! let config = KeyValueStore::new("config.sqlite");
//! CONFIG_SPEC.populate_defaults(&config); //! CONFIG_SPEC.populate_defaults(&config);
//! ```
//!
//! ```ignore
//! // only if you're explicitly wanting to check / edit the config: //! // only if you're explicitly wanting to check / edit the config:
//! CONFIG_SPEC.interactive_check(config); //! CONFIG_SPEC.interactive_check(config);
//! ``` //! ```

View file

@ -1,9 +1,9 @@
use std::error::Error; use std::error::Error;
use colored::Colorize; use colored::Colorize;
use lettre::{Message, SmtpTransport, Transport};
use lettre::message::{header, SinglePart}; use lettre::message::{header, SinglePart};
use lettre::transport::smtp::authentication::Credentials; use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport};
use uuid::Uuid; use uuid::Uuid;
use crate::config_spec::{CfgField, CfgGroup}; use crate::config_spec::{CfgField, CfgGroup};

View file

@ -1,8 +1,12 @@
//! SQLite-backed key/value store, primarily intended as a config file (few writes). //! SQLite-backed key/value store, primarily intended as a config file (few writes).
//! //!
//! ```rust //! ```ignore
//! // Open a new or existing DB (no distinction made.) //! // Open a new or existing DB (no distinction made.)
//! let cfg = KeyValueStore::new("config.sqlite")?; //! let cfg = KeyValueStore::new("config.sqlite")?;
//! ```
//!
//! ```
//! # let cfg = KeyValueStore::new_dummy()?;
//! // Ensure defaults exist. (Do this early, this function panics on error.) //! // Ensure defaults exist. (Do this early, this function panics on error.)
//! cfg.default( "foo", "bar" ); //! cfg.default( "foo", "bar" );
//! cfg.default( "baz", "quux" ); //! cfg.default( "baz", "quux" );
@ -16,13 +20,12 @@
//! let all_ok = !cfg.has_errors(); //! let all_ok = !cfg.has_errors();
//! ``` //! ```
use colored::Colorize;
use rusqlite::{params, Connection, Result};
use std::cell::Cell; use std::cell::Cell;
use std::collections::HashSet; use std::collections::HashSet;
use std::ops::Index; use std::ops::Index;
use colored::Colorize;
use rusqlite::{Connection, params, Result};
/// Simple SQLite-backed key/value store. /// Simple SQLite-backed key/value store.
/// ///
/// All failing writes will log a message, any errors will set `has_errors`. /// All failing writes will log a message, any errors will set `has_errors`.
@ -40,6 +43,17 @@ impl KeyValueStore {
/// Open or create a DB with a `kv_store` table storing all tuples. /// Open or create a DB with a `kv_store` table storing all tuples.
pub fn new(db_path: &str) -> Result<Self> { pub fn new(db_path: &str) -> Result<Self> {
let conn = Connection::open(db_path)?; let conn = Connection::open(db_path)?;
KeyValueStore::setup(conn)
}
/// Mostly for tests, make a temporary DB in memory.
pub fn new_dummy() -> Result<Self> {
let conn = Connection::open_in_memory()?;
KeyValueStore::setup(conn)
}
/// Actual constructor.
fn setup(conn: Connection) -> Result<Self> {
conn.execute( conn.execute(
"CREATE TABLE IF NOT EXISTS kv_store ( "CREATE TABLE IF NOT EXISTS kv_store (
key TEXT PRIMARY KEY, key TEXT PRIMARY KEY,

View file

@ -1,18 +1,3 @@
use std::borrow::Cow;
use std::env;
use std::error::Error;
use chrono::{Datelike, Local, NaiveDate, Weekday};
use clap::{Arg, Command};
use colored::Colorize;
use regex::Regex;
use reqwest::blocking::Client;
use config_spec::{CfgField, CfgGroup, CfgSpec};
use email::{Email, SimpleEmail};
use hedgedoc::HedgeDoc;
use key_value::KeyValueStore as KV;
// Dies ist der Plenumsbot vom Chaos Computer Club Berlin. // Dies ist der Plenumsbot vom Chaos Computer Club Berlin.
/* /*
Plenumsbot Plenumsbot
@ -44,18 +29,28 @@ MediaWiki
future improvements: future improvements:
- search ADJ_TIMEYWIMEY to find places that need adjusting if the bot might run late - search ADJ_TIMEYWIMEY to find places that need adjusting if the bot might run late
(that's an incomplete list, but tag things as you notice them) (that's an incomplete list, but tag things as you notice them)
*/ */
// Import other .rs files as modules
mod key_value;
mod config_spec;
mod template;
use chrono::{Datelike, Local, NaiveDate, Weekday};
use clap::{Arg, Command};
use colored::Colorize;
use regex::Regex;
use reqwest::blocking::Client;
use std::borrow::Cow;
use std::env;
use std::error::Error;
mod key_value;
use key_value::KeyValueStore as KV;
mod config_spec;
use config_spec::{CfgField, CfgGroup, CfgSpec};
mod template;
pub mod variables_and_settings; pub mod variables_and_settings;
mod email; mod email;
use email::{Email, SimpleEmail};
mod hedgedoc; mod hedgedoc;
use hedgedoc::HedgeDoc;
mod mediawiki; mod mediawiki;
const FALLBACK_TEMPLATE: &str = variables_and_settings::FALLBACK_TEMPLATE; const FALLBACK_TEMPLATE: &str = variables_and_settings::FALLBACK_TEMPLATE;

View file

@ -1,11 +1,16 @@
use regex::{Captures, Regex}; use regex::{Captures, Regex};
pub fn replace<F>( text: &str, replacer: F ) -> String where F: Fn(&Captures) -> String { pub fn replace<F>(text: &str, replacer: F) -> String
where
F: Fn(&Captures) -> String,
{
let regex = Regex::new(r"\{\{([\w_-]+)\}\}").unwrap(); let regex = Regex::new(r"\{\{([\w_-]+)\}\}").unwrap();
regex.replace_all(text, replacer).into_owned() regex.replace_all(text, replacer).into_owned()
} }
pub fn config_replacer<'a>( config: &'a crate::KV, blacklist_substrings : &'a [&'a str] ) -> impl Fn(&Captures) -> String + 'a { pub fn config_replacer<'a>(
config: &'a crate::KV, blacklist_substrings: &'a [&'a str],
) -> impl Fn(&Captures) -> String + 'a {
move |caps: &Captures| { move |caps: &Captures| {
let key = &caps[1]; let key = &caps[1];
if blacklist_substrings.iter().any(|&substr| key.contains(substr)) { if blacklist_substrings.iter().any(|&substr| key.contains(substr)) {