1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use crate::{registry, InputValueError, InputValueResult, InputValueType, Type, Value};
use async_graphql_parser::UploadValue;
use std::borrow::Cow;
use std::io::Read;
pub struct Upload(UploadValue);
impl Upload {
    
    pub fn filename(&self) -> &str {
        self.0.filename.as_str()
    }
    
    pub fn content_type(&self) -> Option<&str> {
        self.0.content_type.as_deref()
    }
    
    pub fn into_read(self) -> impl Read + Sync + Send + 'static {
        self.0.content
    }
}
impl<'a> Type for Upload {
    fn type_name() -> Cow<'static, str> {
        Cow::Borrowed("Upload")
    }
    fn create_type_info(registry: &mut registry::Registry) -> String {
        registry.create_type::<Self, _>(|_| registry::MetaType::Scalar {
            name: Self::type_name().to_string(),
            description: None,
            is_valid: |value| match value {
                Value::String(s) => s.starts_with("file:"),
                _ => false,
            },
        })
    }
}
impl<'a> InputValueType for Upload {
    fn parse(value: Value) -> InputValueResult<Self> {
        if let Value::Upload(upload) = value {
            Ok(Upload(upload))
        } else {
            Err(InputValueError::ExpectedType(value))
        }
    }
}