add support for separate notify_push redis instance

This commit is contained in:
Robin Appelman 2025-08-07 16:56:10 +02:00
commit d69ac5e8f2
4 changed files with 20 additions and 9 deletions

2
Cargo.lock generated
View file

@ -836,7 +836,7 @@ dependencies = [
[[package]] [[package]]
name = "nextcloud-config-parser" name = "nextcloud-config-parser"
version = "0.13.1" version = "0.14.0"
dependencies = [ dependencies = [
"form_urlencoded", "form_urlencoded",
"itertools", "itertools",

View file

@ -1,7 +1,7 @@
[package] [package]
name = "nextcloud-config-parser" name = "nextcloud-config-parser"
description = "Rust parser for nextcloud config files" description = "Rust parser for nextcloud config files"
version = "0.13.1" version = "0.14.0"
authors = ["Robin Appelman <robin@icewind.nl>"] authors = ["Robin Appelman <robin@icewind.nl>"]
edition = "2021" edition = "2021"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"

View file

@ -11,10 +11,12 @@ use thiserror::Error;
pub use nc::{parse, parse_glob}; pub use nc::{parse, parse_glob};
#[derive(Debug)] #[derive(Debug)]
#[non_exhaustive]
pub struct Config { pub struct Config {
pub database: Database, pub database: Database,
pub database_prefix: String, pub database_prefix: String,
pub redis: RedisConfig, pub redis: RedisConfig,
pub notify_push_redis: Option<RedisConfig>,
pub nextcloud_url: String, pub nextcloud_url: String,
} }

View file

@ -109,13 +109,19 @@ fn parse_files(files: impl IntoIterator<Item = PathBuf>) -> Result<Config> {
.clone() .clone()
.into_string() .into_string()
.ok_or(Error::NoUrl)?; .ok_or(Error::NoUrl)?;
let redis = parse_redis_options(&parsed); let redis = parse_redis_options(&parsed, "redis");
let notify_push_redis = if parsed["notify_push_redis"].is_array() {
Some(parse_redis_options(&parsed, "notify_push_redis"))
} else {
None
};
Ok(Config { Ok(Config {
database, database,
database_prefix, database_prefix,
nextcloud_url, nextcloud_url,
redis, redis,
notify_push_redis,
}) })
} }
@ -284,9 +290,12 @@ enum RedisAddress {
Cluster(Vec<RedisConnectionAddr>), Cluster(Vec<RedisConnectionAddr>),
} }
fn parse_redis_options(parsed: &Value) -> RedisConfig { fn parse_redis_options(parsed: &Value, key: &str) -> RedisConfig {
let (redis_options, address) = if parsed["redis.cluster"].is_array() { let cluster_key = format!("{key}.cluster");
let redis_options = &parsed["redis.cluster"]; let cluster_key = cluster_key.as_str();
let (redis_options, address) = if parsed[cluster_key].is_array() {
let redis_options = &parsed[cluster_key];
let seeds = redis_options["seeds"].values(); let seeds = redis_options["seeds"].values();
let mut addresses = seeds let mut addresses = seeds
.filter_map(|seed| seed.as_str()) .filter_map(|seed| seed.as_str())
@ -297,7 +306,7 @@ fn parse_redis_options(parsed: &Value) -> RedisConfig {
addresses.sort(); addresses.sort();
(redis_options, RedisAddress::Cluster(addresses)) (redis_options, RedisAddress::Cluster(addresses))
} else { } else {
let redis_options = &parsed["redis"]; let redis_options = &parsed[key];
let host = redis_options["host"].as_str().unwrap_or("127.0.0.1"); let host = redis_options["host"].as_str().unwrap_or("127.0.0.1");
let address = RedisAddress::Single(RedisConnectionAddr::parse( let address = RedisAddress::Single(RedisConnectionAddr::parse(
host, host,
@ -355,12 +364,12 @@ fn test_redis_empty_password_none() {
let config = let config =
php_literal_parser::from_str(r#"["redis" => ["host" => "redis", "password" => "pass"]]"#) php_literal_parser::from_str(r#"["redis" => ["host" => "redis", "password" => "pass"]]"#)
.unwrap(); .unwrap();
let redis = parse_redis_options(&config); let redis = parse_redis_options(&config, "redis");
assert_eq!(redis.passwd(), Some("pass")); assert_eq!(redis.passwd(), Some("pass"));
let config = let config =
php_literal_parser::from_str(r#"["redis" => ["host" => "redis", "password" => ""]]"#) php_literal_parser::from_str(r#"["redis" => ["host" => "redis", "password" => ""]]"#)
.unwrap(); .unwrap();
let redis = parse_redis_options(&config); let redis = parse_redis_options(&config, "redis");
assert_eq!(redis.passwd(), None); assert_eq!(redis.passwd(), None);
} }