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]]
name = "nextcloud-config-parser"
version = "0.13.1"
version = "0.14.0"
dependencies = [
"form_urlencoded",
"itertools",

View file

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

View file

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

View file

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