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
90
91
92
93
94
95
96
97
98
use crate::parser::types::UploadValue;
use crate::{registry, InputValueError, InputValueResult, InputValueType, Type, Value};
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 size(&self) -> std::io::Result<u64> {
self.0.content.metadata().map(|meta| meta.len())
}
pub fn into_read(self) -> impl Read + Sync + Send + 'static {
self.0.content
}
}
impl 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| matches!(value, Value::Upload(_)),
})
}
}
impl InputValueType for Upload {
fn parse(value: Option<Value>) -> InputValueResult<Self> {
let value = value.unwrap_or_default();
if let Value::Upload(upload) = value {
Ok(Upload(upload))
} else {
Err(InputValueError::ExpectedType(value))
}
}
fn to_value(&self) -> Value {
Value::Null
}
}