spikard 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.md +659 -659
- data/ext/spikard_rb/Cargo.toml +17 -17
- data/ext/spikard_rb/extconf.rb +10 -10
- data/ext/spikard_rb/src/lib.rs +6 -6
- data/lib/spikard/app.rb +386 -386
- data/lib/spikard/background.rb +27 -27
- data/lib/spikard/config.rb +396 -396
- data/lib/spikard/converters.rb +13 -13
- data/lib/spikard/handler_wrapper.rb +113 -113
- data/lib/spikard/provide.rb +214 -214
- data/lib/spikard/response.rb +173 -173
- data/lib/spikard/schema.rb +243 -243
- data/lib/spikard/sse.rb +111 -111
- data/lib/spikard/streaming_response.rb +44 -44
- data/lib/spikard/testing.rb +221 -221
- data/lib/spikard/upload_file.rb +131 -131
- data/lib/spikard/version.rb +5 -5
- data/lib/spikard/websocket.rb +59 -59
- data/lib/spikard.rb +43 -43
- data/sig/spikard.rbs +366 -360
- data/vendor/crates/spikard-core/Cargo.toml +40 -40
- data/vendor/crates/spikard-core/src/bindings/mod.rs +3 -3
- data/vendor/crates/spikard-core/src/bindings/response.rs +133 -133
- data/vendor/crates/spikard-core/src/debug.rs +63 -63
- data/vendor/crates/spikard-core/src/di/container.rs +726 -726
- data/vendor/crates/spikard-core/src/di/dependency.rs +273 -273
- data/vendor/crates/spikard-core/src/di/error.rs +118 -118
- data/vendor/crates/spikard-core/src/di/factory.rs +538 -538
- data/vendor/crates/spikard-core/src/di/graph.rs +545 -545
- data/vendor/crates/spikard-core/src/di/mod.rs +192 -192
- data/vendor/crates/spikard-core/src/di/resolved.rs +411 -411
- data/vendor/crates/spikard-core/src/di/value.rs +283 -283
- data/vendor/crates/spikard-core/src/errors.rs +39 -39
- data/vendor/crates/spikard-core/src/http.rs +153 -153
- data/vendor/crates/spikard-core/src/lib.rs +29 -29
- data/vendor/crates/spikard-core/src/lifecycle.rs +422 -422
- data/vendor/crates/spikard-core/src/parameters.rs +722 -722
- data/vendor/crates/spikard-core/src/problem.rs +310 -310
- data/vendor/crates/spikard-core/src/request_data.rs +189 -189
- data/vendor/crates/spikard-core/src/router.rs +249 -249
- data/vendor/crates/spikard-core/src/schema_registry.rs +183 -183
- data/vendor/crates/spikard-core/src/type_hints.rs +304 -304
- data/vendor/crates/spikard-core/src/validation.rs +699 -699
- data/vendor/crates/spikard-http/Cargo.toml +68 -58
- data/vendor/crates/spikard-http/src/auth.rs +247 -247
- data/vendor/crates/spikard-http/src/background.rs +249 -249
- data/vendor/crates/spikard-http/src/bindings/mod.rs +3 -3
- data/vendor/crates/spikard-http/src/bindings/response.rs +1 -1
- data/vendor/crates/spikard-http/src/body_metadata.rs +8 -8
- data/vendor/crates/spikard-http/src/cors.rs +490 -490
- data/vendor/crates/spikard-http/src/debug.rs +63 -63
- data/vendor/crates/spikard-http/src/di_handler.rs +423 -423
- data/vendor/crates/spikard-http/src/handler_response.rs +190 -190
- data/vendor/crates/spikard-http/src/handler_trait.rs +228 -228
- data/vendor/crates/spikard-http/src/handler_trait_tests.rs +284 -284
- data/vendor/crates/spikard-http/src/lib.rs +529 -529
- data/vendor/crates/spikard-http/src/lifecycle/adapter.rs +149 -149
- data/vendor/crates/spikard-http/src/lifecycle.rs +428 -428
- data/vendor/crates/spikard-http/src/middleware/mod.rs +285 -285
- data/vendor/crates/spikard-http/src/middleware/multipart.rs +86 -86
- data/vendor/crates/spikard-http/src/middleware/urlencoded.rs +147 -147
- data/vendor/crates/spikard-http/src/middleware/validation.rs +287 -287
- data/vendor/crates/spikard-http/src/openapi/mod.rs +309 -309
- data/vendor/crates/spikard-http/src/openapi/parameter_extraction.rs +190 -190
- data/vendor/crates/spikard-http/src/openapi/schema_conversion.rs +308 -308
- data/vendor/crates/spikard-http/src/openapi/spec_generation.rs +195 -195
- data/vendor/crates/spikard-http/src/parameters.rs +1 -1
- data/vendor/crates/spikard-http/src/problem.rs +1 -1
- data/vendor/crates/spikard-http/src/query_parser.rs +369 -369
- data/vendor/crates/spikard-http/src/response.rs +399 -399
- data/vendor/crates/spikard-http/src/router.rs +1 -1
- data/vendor/crates/spikard-http/src/schema_registry.rs +1 -1
- data/vendor/crates/spikard-http/src/server/handler.rs +87 -87
- data/vendor/crates/spikard-http/src/server/lifecycle_execution.rs +98 -98
- data/vendor/crates/spikard-http/src/server/mod.rs +805 -805
- data/vendor/crates/spikard-http/src/server/request_extraction.rs +119 -119
- data/vendor/crates/spikard-http/src/sse.rs +447 -447
- data/vendor/crates/spikard-http/src/testing/form.rs +14 -14
- data/vendor/crates/spikard-http/src/testing/multipart.rs +60 -60
- data/vendor/crates/spikard-http/src/testing/test_client.rs +285 -285
- data/vendor/crates/spikard-http/src/testing.rs +377 -377
- data/vendor/crates/spikard-http/src/type_hints.rs +1 -1
- data/vendor/crates/spikard-http/src/validation.rs +1 -1
- data/vendor/crates/spikard-http/src/websocket.rs +324 -324
- data/vendor/crates/spikard-rb/Cargo.toml +42 -42
- data/vendor/crates/spikard-rb/build.rs +8 -8
- data/vendor/crates/spikard-rb/src/background.rs +63 -63
- data/vendor/crates/spikard-rb/src/config.rs +294 -294
- data/vendor/crates/spikard-rb/src/conversion.rs +453 -453
- data/vendor/crates/spikard-rb/src/di.rs +409 -409
- data/vendor/crates/spikard-rb/src/handler.rs +625 -625
- data/vendor/crates/spikard-rb/src/lib.rs +2771 -2771
- data/vendor/crates/spikard-rb/src/lifecycle.rs +274 -274
- data/vendor/crates/spikard-rb/src/server.rs +283 -283
- data/vendor/crates/spikard-rb/src/sse.rs +231 -231
- data/vendor/crates/spikard-rb/src/test_client.rs +404 -404
- data/vendor/crates/spikard-rb/src/test_sse.rs +143 -143
- data/vendor/crates/spikard-rb/src/test_websocket.rs +221 -221
- data/vendor/crates/spikard-rb/src/websocket.rs +233 -233
- metadata +1 -79
- data/vendor/spikard-core/Cargo.toml +0 -40
- data/vendor/spikard-core/src/bindings/mod.rs +0 -3
- data/vendor/spikard-core/src/bindings/response.rs +0 -133
- data/vendor/spikard-core/src/debug.rs +0 -63
- data/vendor/spikard-core/src/di/container.rs +0 -726
- data/vendor/spikard-core/src/di/dependency.rs +0 -273
- data/vendor/spikard-core/src/di/error.rs +0 -118
- data/vendor/spikard-core/src/di/factory.rs +0 -538
- data/vendor/spikard-core/src/di/graph.rs +0 -545
- data/vendor/spikard-core/src/di/mod.rs +0 -192
- data/vendor/spikard-core/src/di/resolved.rs +0 -411
- data/vendor/spikard-core/src/di/value.rs +0 -283
- data/vendor/spikard-core/src/http.rs +0 -153
- data/vendor/spikard-core/src/lib.rs +0 -28
- data/vendor/spikard-core/src/lifecycle.rs +0 -422
- data/vendor/spikard-core/src/parameters.rs +0 -719
- data/vendor/spikard-core/src/problem.rs +0 -310
- data/vendor/spikard-core/src/request_data.rs +0 -189
- data/vendor/spikard-core/src/router.rs +0 -249
- data/vendor/spikard-core/src/schema_registry.rs +0 -183
- data/vendor/spikard-core/src/type_hints.rs +0 -304
- data/vendor/spikard-core/src/validation.rs +0 -699
- data/vendor/spikard-http/Cargo.toml +0 -58
- data/vendor/spikard-http/src/auth.rs +0 -247
- data/vendor/spikard-http/src/background.rs +0 -249
- data/vendor/spikard-http/src/bindings/mod.rs +0 -3
- data/vendor/spikard-http/src/bindings/response.rs +0 -1
- data/vendor/spikard-http/src/body_metadata.rs +0 -8
- data/vendor/spikard-http/src/cors.rs +0 -490
- data/vendor/spikard-http/src/debug.rs +0 -63
- data/vendor/spikard-http/src/di_handler.rs +0 -423
- data/vendor/spikard-http/src/handler_response.rs +0 -190
- data/vendor/spikard-http/src/handler_trait.rs +0 -228
- data/vendor/spikard-http/src/handler_trait_tests.rs +0 -284
- data/vendor/spikard-http/src/lib.rs +0 -529
- data/vendor/spikard-http/src/lifecycle/adapter.rs +0 -149
- data/vendor/spikard-http/src/lifecycle.rs +0 -428
- data/vendor/spikard-http/src/middleware/mod.rs +0 -285
- data/vendor/spikard-http/src/middleware/multipart.rs +0 -86
- data/vendor/spikard-http/src/middleware/urlencoded.rs +0 -147
- data/vendor/spikard-http/src/middleware/validation.rs +0 -287
- data/vendor/spikard-http/src/openapi/mod.rs +0 -309
- data/vendor/spikard-http/src/openapi/parameter_extraction.rs +0 -190
- data/vendor/spikard-http/src/openapi/schema_conversion.rs +0 -308
- data/vendor/spikard-http/src/openapi/spec_generation.rs +0 -195
- data/vendor/spikard-http/src/parameters.rs +0 -1
- data/vendor/spikard-http/src/problem.rs +0 -1
- data/vendor/spikard-http/src/query_parser.rs +0 -369
- data/vendor/spikard-http/src/response.rs +0 -399
- data/vendor/spikard-http/src/router.rs +0 -1
- data/vendor/spikard-http/src/schema_registry.rs +0 -1
- data/vendor/spikard-http/src/server/handler.rs +0 -80
- data/vendor/spikard-http/src/server/lifecycle_execution.rs +0 -98
- data/vendor/spikard-http/src/server/mod.rs +0 -805
- data/vendor/spikard-http/src/server/request_extraction.rs +0 -119
- data/vendor/spikard-http/src/sse.rs +0 -447
- data/vendor/spikard-http/src/testing/form.rs +0 -14
- data/vendor/spikard-http/src/testing/multipart.rs +0 -60
- data/vendor/spikard-http/src/testing/test_client.rs +0 -285
- data/vendor/spikard-http/src/testing.rs +0 -377
- data/vendor/spikard-http/src/type_hints.rs +0 -1
- data/vendor/spikard-http/src/validation.rs +0 -1
- data/vendor/spikard-http/src/websocket.rs +0 -324
- data/vendor/spikard-rb/Cargo.toml +0 -42
- data/vendor/spikard-rb/build.rs +0 -8
- data/vendor/spikard-rb/src/background.rs +0 -63
- data/vendor/spikard-rb/src/config.rs +0 -294
- data/vendor/spikard-rb/src/conversion.rs +0 -392
- data/vendor/spikard-rb/src/di.rs +0 -409
- data/vendor/spikard-rb/src/handler.rs +0 -534
- data/vendor/spikard-rb/src/lib.rs +0 -2020
- data/vendor/spikard-rb/src/lifecycle.rs +0 -267
- data/vendor/spikard-rb/src/server.rs +0 -283
- data/vendor/spikard-rb/src/sse.rs +0 -231
- data/vendor/spikard-rb/src/test_client.rs +0 -404
- data/vendor/spikard-rb/src/test_sse.rs +0 -143
- data/vendor/spikard-rb/src/test_websocket.rs +0 -221
- data/vendor/spikard-rb/src/websocket.rs +0 -233
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
use serde_json::Value;
|
|
2
|
-
|
|
3
|
-
/// Encode JSON form data as application/x-www-form-urlencoded bytes.
|
|
4
|
-
pub fn encode_urlencoded_body(value: &Value) -> Result<Vec<u8>, String> {
|
|
5
|
-
match value {
|
|
6
|
-
Value::String(s) => Ok(s.as_bytes().to_vec()),
|
|
7
|
-
Value::Null => Ok(Vec::new()),
|
|
8
|
-
Value::Bool(b) => Ok(b.to_string().into_bytes()),
|
|
9
|
-
Value::Number(num) => Ok(num.to_string().into_bytes()),
|
|
10
|
-
Value::Object(_) | Value::Array(_) => serde_qs::to_string(value)
|
|
11
|
-
.map(|encoded| encoded.into_bytes())
|
|
12
|
-
.map_err(|err| err.to_string()),
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
use serde_json::Value;
|
|
2
|
+
|
|
3
|
+
/// Encode JSON form data as application/x-www-form-urlencoded bytes.
|
|
4
|
+
pub fn encode_urlencoded_body(value: &Value) -> Result<Vec<u8>, String> {
|
|
5
|
+
match value {
|
|
6
|
+
Value::String(s) => Ok(s.as_bytes().to_vec()),
|
|
7
|
+
Value::Null => Ok(Vec::new()),
|
|
8
|
+
Value::Bool(b) => Ok(b.to_string().into_bytes()),
|
|
9
|
+
Value::Number(num) => Ok(num.to_string().into_bytes()),
|
|
10
|
+
Value::Object(_) | Value::Array(_) => serde_qs::to_string(value)
|
|
11
|
+
.map(|encoded| encoded.into_bytes())
|
|
12
|
+
.map_err(|err| err.to_string()),
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
use std::time::{SystemTime, UNIX_EPOCH};
|
|
2
|
-
|
|
3
|
-
/// File part metadata for multipart/form-data payloads.
|
|
4
|
-
#[derive(Debug, Clone)]
|
|
5
|
-
pub struct MultipartFilePart {
|
|
6
|
-
pub field_name: String,
|
|
7
|
-
pub filename: String,
|
|
8
|
-
pub content_type: Option<String>,
|
|
9
|
-
pub content: Vec<u8>,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/// Build a multipart/form-data body from fields and files.
|
|
13
|
-
pub fn build_multipart_body(form_fields: &[(String, String)], files: &[MultipartFilePart]) -> (Vec<u8>, String) {
|
|
14
|
-
let boundary = generate_boundary();
|
|
15
|
-
let mut body = Vec::new();
|
|
16
|
-
|
|
17
|
-
for (name, value) in form_fields {
|
|
18
|
-
body.extend_from_slice(b"--");
|
|
19
|
-
body.extend_from_slice(boundary.as_bytes());
|
|
20
|
-
body.extend_from_slice(b"\r\n");
|
|
21
|
-
body.extend_from_slice(b"Content-Disposition: form-data; name=\"");
|
|
22
|
-
body.extend_from_slice(name.as_bytes());
|
|
23
|
-
body.extend_from_slice(b"\"\r\n\r\n");
|
|
24
|
-
body.extend_from_slice(value.as_bytes());
|
|
25
|
-
body.extend_from_slice(b"\r\n");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
for file in files {
|
|
29
|
-
body.extend_from_slice(b"--");
|
|
30
|
-
body.extend_from_slice(boundary.as_bytes());
|
|
31
|
-
body.extend_from_slice(b"\r\n");
|
|
32
|
-
body.extend_from_slice(b"Content-Disposition: form-data; name=\"");
|
|
33
|
-
body.extend_from_slice(file.field_name.as_bytes());
|
|
34
|
-
body.extend_from_slice(b"\"; filename=\"");
|
|
35
|
-
body.extend_from_slice(file.filename.as_bytes());
|
|
36
|
-
body.extend_from_slice(b"\"\r\n");
|
|
37
|
-
if let Some(content_type) = &file.content_type {
|
|
38
|
-
body.extend_from_slice(b"Content-Type: ");
|
|
39
|
-
body.extend_from_slice(content_type.as_bytes());
|
|
40
|
-
body.extend_from_slice(b"\r\n");
|
|
41
|
-
}
|
|
42
|
-
body.extend_from_slice(b"\r\n");
|
|
43
|
-
body.extend_from_slice(&file.content);
|
|
44
|
-
body.extend_from_slice(b"\r\n");
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
body.extend_from_slice(b"--");
|
|
48
|
-
body.extend_from_slice(boundary.as_bytes());
|
|
49
|
-
body.extend_from_slice(b"--\r\n");
|
|
50
|
-
|
|
51
|
-
(body, boundary)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
fn generate_boundary() -> String {
|
|
55
|
-
let nanos = SystemTime::now()
|
|
56
|
-
.duration_since(UNIX_EPOCH)
|
|
57
|
-
.map(|duration| duration.as_nanos())
|
|
58
|
-
.unwrap_or_default();
|
|
59
|
-
format!("spikard-boundary-{nanos}")
|
|
60
|
-
}
|
|
1
|
+
use std::time::{SystemTime, UNIX_EPOCH};
|
|
2
|
+
|
|
3
|
+
/// File part metadata for multipart/form-data payloads.
|
|
4
|
+
#[derive(Debug, Clone)]
|
|
5
|
+
pub struct MultipartFilePart {
|
|
6
|
+
pub field_name: String,
|
|
7
|
+
pub filename: String,
|
|
8
|
+
pub content_type: Option<String>,
|
|
9
|
+
pub content: Vec<u8>,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// Build a multipart/form-data body from fields and files.
|
|
13
|
+
pub fn build_multipart_body(form_fields: &[(String, String)], files: &[MultipartFilePart]) -> (Vec<u8>, String) {
|
|
14
|
+
let boundary = generate_boundary();
|
|
15
|
+
let mut body = Vec::new();
|
|
16
|
+
|
|
17
|
+
for (name, value) in form_fields {
|
|
18
|
+
body.extend_from_slice(b"--");
|
|
19
|
+
body.extend_from_slice(boundary.as_bytes());
|
|
20
|
+
body.extend_from_slice(b"\r\n");
|
|
21
|
+
body.extend_from_slice(b"Content-Disposition: form-data; name=\"");
|
|
22
|
+
body.extend_from_slice(name.as_bytes());
|
|
23
|
+
body.extend_from_slice(b"\"\r\n\r\n");
|
|
24
|
+
body.extend_from_slice(value.as_bytes());
|
|
25
|
+
body.extend_from_slice(b"\r\n");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
for file in files {
|
|
29
|
+
body.extend_from_slice(b"--");
|
|
30
|
+
body.extend_from_slice(boundary.as_bytes());
|
|
31
|
+
body.extend_from_slice(b"\r\n");
|
|
32
|
+
body.extend_from_slice(b"Content-Disposition: form-data; name=\"");
|
|
33
|
+
body.extend_from_slice(file.field_name.as_bytes());
|
|
34
|
+
body.extend_from_slice(b"\"; filename=\"");
|
|
35
|
+
body.extend_from_slice(file.filename.as_bytes());
|
|
36
|
+
body.extend_from_slice(b"\"\r\n");
|
|
37
|
+
if let Some(content_type) = &file.content_type {
|
|
38
|
+
body.extend_from_slice(b"Content-Type: ");
|
|
39
|
+
body.extend_from_slice(content_type.as_bytes());
|
|
40
|
+
body.extend_from_slice(b"\r\n");
|
|
41
|
+
}
|
|
42
|
+
body.extend_from_slice(b"\r\n");
|
|
43
|
+
body.extend_from_slice(&file.content);
|
|
44
|
+
body.extend_from_slice(b"\r\n");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
body.extend_from_slice(b"--");
|
|
48
|
+
body.extend_from_slice(boundary.as_bytes());
|
|
49
|
+
body.extend_from_slice(b"--\r\n");
|
|
50
|
+
|
|
51
|
+
(body, boundary)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fn generate_boundary() -> String {
|
|
55
|
+
let nanos = SystemTime::now()
|
|
56
|
+
.duration_since(UNIX_EPOCH)
|
|
57
|
+
.map(|duration| duration.as_nanos())
|
|
58
|
+
.unwrap_or_default();
|
|
59
|
+
format!("spikard-boundary-{nanos}")
|
|
60
|
+
}
|