term_model/config/
scrolling.rs

1use serde::{Deserialize, Deserializer};
2
3use crate::config::{failure_default, MAX_SCROLLBACK_LINES};
4
5/// Struct for scrolling related settings
6#[serde(default)]
7#[derive(Deserialize, Copy, Clone, Default, Debug, PartialEq, Eq)]
8pub struct Scrolling {
9    #[serde(deserialize_with = "failure_default")]
10    history: ScrollingHistory,
11    #[serde(deserialize_with = "failure_default")]
12    multiplier: ScrollingMultiplier,
13
14    // TODO: REMOVED
15    #[serde(deserialize_with = "failure_default")]
16    pub auto_scroll: Option<bool>,
17
18    // TODO: DEPRECATED
19    #[serde(deserialize_with = "failure_default")]
20    faux_multiplier: Option<ScrollingMultiplier>,
21}
22
23impl Scrolling {
24    pub fn history(self) -> u32 {
25        self.history.0
26    }
27
28    pub fn multiplier(self) -> u8 {
29        self.multiplier.0
30    }
31
32    pub fn faux_multiplier(self) -> Option<u8> {
33        self.faux_multiplier.map(|sm| sm.0)
34    }
35
36    // Update the history size, used in ref tests
37    pub fn set_history(&mut self, history: u32) {
38        self.history = ScrollingHistory(history);
39    }
40}
41
42#[derive(Copy, Clone, Debug, PartialEq, Eq, Deserialize)]
43struct ScrollingMultiplier(u8);
44
45impl Default for ScrollingMultiplier {
46    fn default() -> Self {
47        ScrollingMultiplier(3)
48    }
49}
50
51#[derive(Copy, Clone, Debug, PartialEq, Eq)]
52struct ScrollingHistory(u32);
53
54impl Default for ScrollingHistory {
55    fn default() -> Self {
56        ScrollingHistory(10_000)
57    }
58}
59
60impl<'de> Deserialize<'de> for ScrollingHistory {
61    fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
62    where
63        D: Deserializer<'de>,
64    {
65        let value = serde_json::Value::deserialize(deserializer)?;
66        match u32::deserialize(value) {
67            Ok(lines) => {
68                if lines > MAX_SCROLLBACK_LINES {
69                    Ok(ScrollingHistory(MAX_SCROLLBACK_LINES))
70                } else {
71                    Ok(ScrollingHistory(lines))
72                }
73            }
74            Err(_err) => Ok(Default::default()),
75        }
76    }
77}