turbopack_dev_server/source/
query.rs

1use std::{collections::BTreeMap, hash::Hash, ops::DerefMut};
2
3use serde::{Deserialize, Serialize};
4use turbo_tasks::{NonLocalValue, trace::TraceRawVcs};
5
6use super::ContentSourceDataFilter;
7
8/// A parsed query string from a http request
9#[derive(
10    Clone, Debug, PartialEq, Eq, Default, Hash, TraceRawVcs, Serialize, Deserialize, NonLocalValue,
11)]
12#[serde(transparent)]
13pub struct Query(BTreeMap<String, QueryValue>);
14
15impl Query {
16    pub fn filter_with(&mut self, filter: &ContentSourceDataFilter) {
17        match filter {
18            ContentSourceDataFilter::All => {
19                // fast path without iterating query
20            }
21            _ => self.0.retain(|k, _| filter.contains(k)),
22        }
23    }
24}
25
26impl std::ops::Deref for Query {
27    type Target = BTreeMap<String, QueryValue>;
28    fn deref(&self) -> &Self::Target {
29        &self.0
30    }
31}
32
33impl DerefMut for Query {
34    fn deref_mut(&mut self) -> &mut Self::Target {
35        &mut self.0
36    }
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, Hash, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
40#[serde(untagged)]
41pub enum QueryValue {
42    /// Simple string value, might be an empty string when there is no value
43    String(String),
44    /// An array of values
45    Array(Vec<QueryValue>),
46    /// A nested structure
47    Nested(Query),
48}