turbopack_dev_server/source/
query.rs

1use std::{collections::BTreeMap, hash::Hash, ops::DerefMut};
2
3use serde::{Deserialize, Serialize};
4use turbo_tasks::{NonLocalValue, TaskInput, 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
15// This type contains no VCs so the default implementation works.
16// Query is also recursive through QueryValue so the derive macro doesnt work
17impl TaskInput for Query {
18    fn is_transient(&self) -> bool {
19        false
20    }
21}
22
23impl Query {
24    pub fn filter_with(&mut self, filter: &ContentSourceDataFilter) {
25        match filter {
26            ContentSourceDataFilter::All => {
27                // fast path without iterating query
28            }
29            _ => self.0.retain(|k, _| filter.contains(k)),
30        }
31    }
32}
33
34impl std::ops::Deref for Query {
35    type Target = BTreeMap<String, QueryValue>;
36    fn deref(&self) -> &Self::Target {
37        &self.0
38    }
39}
40
41impl DerefMut for Query {
42    fn deref_mut(&mut self) -> &mut Self::Target {
43        &mut self.0
44    }
45}
46
47#[derive(Clone, Debug, PartialEq, Eq, Hash, TraceRawVcs, Serialize, Deserialize, NonLocalValue)]
48#[serde(untagged)]
49pub enum QueryValue {
50    /// Simple string value, might be an empty string when there is no value
51    String(String),
52    /// An array of values
53    Array(Vec<QueryValue>),
54    /// A nested structure
55    Nested(Query),
56}