Skip to main content

reinhardt_conf/settings/
media.rs

1//! Media settings fragment
2//!
3//! Provides composable media file serving configuration as a [`SettingsFragment`](crate::settings::fragment::SettingsFragment).
4
5use reinhardt_core::macros::settings;
6use serde::{Deserialize, Serialize};
7use std::path::PathBuf;
8
9/// Media files configuration fragment.
10///
11/// Controls the URL prefix and root directory for user-uploaded media files.
12#[settings(fragment = true, section = "media")]
13#[non_exhaustive]
14#[derive(Clone, Debug, Serialize, Deserialize)]
15pub struct MediaSettings {
16	/// URL prefix for serving user-uploaded media files (e.g., `"/media/"`).
17	#[serde(default = "default_media_url")]
18	pub url: String,
19	/// Root directory for user-uploaded media files.
20	#[serde(default = "default_media_root")]
21	pub root: PathBuf,
22}
23
24fn default_media_url() -> String {
25	"/media/".to_string()
26}
27
28fn default_media_root() -> PathBuf {
29	PathBuf::from("media")
30}
31
32impl Default for MediaSettings {
33	fn default() -> Self {
34		Self {
35			url: "/media/".to_string(),
36			root: PathBuf::from("media"),
37		}
38	}
39}
40
41#[cfg(test)]
42mod tests {
43	use super::*;
44	use crate::settings::fragment::SettingsFragment;
45	use rstest::rstest;
46
47	#[rstest]
48	fn test_media_section_name() {
49		// Arrange / Act
50		let section = MediaSettings::section();
51
52		// Assert
53		assert_eq!(section, "media");
54	}
55
56	#[rstest]
57	fn test_media_default_values() {
58		// Arrange / Act
59		let settings = MediaSettings::default();
60
61		// Assert
62		assert_eq!(settings.url, "/media/");
63		assert_eq!(settings.root, PathBuf::from("media"));
64	}
65}