Skip to content

Commit c1990bf

Browse files
authored
feat(spansy): conversion traits (#22)
1 parent 554b7be commit c1990bf

File tree

3 files changed

+262
-44
lines changed

3 files changed

+262
-44
lines changed

spansy/src/http/types.rs

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use utils::range::{RangeDifference, RangeSet};
1+
use utils::range::{RangeDifference, RangeSet, ToRangeSet};
22

33
use crate::{json::JsonValue, Span, Spanned};
44

@@ -25,6 +25,12 @@ impl Spanned<str> for HeaderName {
2525
}
2626
}
2727

28+
impl ToRangeSet<usize> for HeaderName {
29+
fn to_range_set(&self) -> RangeSet<usize> {
30+
self.0.indices.clone()
31+
}
32+
}
33+
2834
/// An HTTP header value.
2935
#[derive(Debug, Clone, PartialEq, Eq)]
3036
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -48,6 +54,12 @@ impl Spanned for HeaderValue {
4854
}
4955
}
5056

57+
impl ToRangeSet<usize> for HeaderValue {
58+
fn to_range_set(&self) -> RangeSet<usize> {
59+
self.0.indices.clone()
60+
}
61+
}
62+
5163
/// An HTTP header, including optional whitespace and the trailing CRLF.
5264
#[derive(Debug, Clone, PartialEq, Eq)]
5365
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -81,6 +93,12 @@ impl Spanned for Header {
8193
}
8294
}
8395

96+
impl ToRangeSet<usize> for Header {
97+
fn to_range_set(&self) -> RangeSet<usize> {
98+
self.span.indices.clone()
99+
}
100+
}
101+
84102
/// An HTTP request method.
85103
#[derive(Debug, Clone, PartialEq, Eq)]
86104
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -104,6 +122,12 @@ impl Spanned<str> for Method {
104122
}
105123
}
106124

125+
impl ToRangeSet<usize> for Method {
126+
fn to_range_set(&self) -> RangeSet<usize> {
127+
self.0.indices.clone()
128+
}
129+
}
130+
107131
/// An HTTP request target.
108132
#[derive(Debug, Clone, PartialEq, Eq)]
109133
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -127,6 +151,12 @@ impl Spanned<str> for Target {
127151
}
128152
}
129153

154+
impl ToRangeSet<usize> for Target {
155+
fn to_range_set(&self) -> RangeSet<usize> {
156+
self.0.indices.clone()
157+
}
158+
}
159+
130160
/// An HTTP request line, including the trailing CRLF.
131161
#[derive(Debug, Clone, PartialEq, Eq)]
132162
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -159,6 +189,12 @@ impl Spanned<str> for RequestLine {
159189
}
160190
}
161191

192+
impl ToRangeSet<usize> for RequestLine {
193+
fn to_range_set(&self) -> RangeSet<usize> {
194+
self.span.indices.clone()
195+
}
196+
}
197+
162198
/// An HTTP request.
163199
#[derive(Debug, Clone, PartialEq, Eq)]
164200
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -214,6 +250,12 @@ impl Spanned for Request {
214250
}
215251
}
216252

253+
impl ToRangeSet<usize> for Request {
254+
fn to_range_set(&self) -> RangeSet<usize> {
255+
self.span.indices.clone()
256+
}
257+
}
258+
217259
/// An HTTP response code.
218260
#[derive(Debug, Clone, PartialEq, Eq)]
219261
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -237,6 +279,12 @@ impl Spanned<str> for Code {
237279
}
238280
}
239281

282+
impl ToRangeSet<usize> for Code {
283+
fn to_range_set(&self) -> RangeSet<usize> {
284+
self.0.indices.clone()
285+
}
286+
}
287+
240288
/// An HTTP response reason phrase.
241289
#[derive(Debug, Clone, PartialEq, Eq)]
242290
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -260,6 +308,12 @@ impl Spanned<str> for Reason {
260308
}
261309
}
262310

311+
impl ToRangeSet<usize> for Reason {
312+
fn to_range_set(&self) -> RangeSet<usize> {
313+
self.0.indices.clone()
314+
}
315+
}
316+
263317
/// An HTTP response status.
264318
#[derive(Debug, Clone, PartialEq, Eq)]
265319
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -287,6 +341,12 @@ impl Spanned<str> for Status {
287341
}
288342
}
289343

344+
impl ToRangeSet<usize> for Status {
345+
fn to_range_set(&self) -> RangeSet<usize> {
346+
self.span.indices.clone()
347+
}
348+
}
349+
290350
/// An HTTP response.
291351
#[derive(Debug, Clone, PartialEq, Eq)]
292352
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -342,6 +402,12 @@ impl Spanned for Response {
342402
}
343403
}
344404

405+
impl ToRangeSet<usize> for Response {
406+
fn to_range_set(&self) -> RangeSet<usize> {
407+
self.span.indices.clone()
408+
}
409+
}
410+
345411
/// An HTTP request or response payload body.
346412
#[derive(Debug, Clone, PartialEq, Eq)]
347413
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -370,6 +436,12 @@ impl Spanned for Body {
370436
}
371437
}
372438

439+
impl ToRangeSet<usize> for Body {
440+
fn to_range_set(&self) -> RangeSet<usize> {
441+
self.span.indices.clone()
442+
}
443+
}
444+
373445
/// An HTTP request or response payload body content.
374446
#[derive(Debug, Clone, PartialEq, Eq)]
375447
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -389,3 +461,12 @@ impl Spanned for BodyContent {
389461
}
390462
}
391463
}
464+
465+
impl ToRangeSet<usize> for BodyContent {
466+
fn to_range_set(&self) -> RangeSet<usize> {
467+
match self {
468+
BodyContent::Json(json) => json.span().indices.clone(),
469+
BodyContent::Unknown(span) => span.indices.clone(),
470+
}
471+
}
472+
}

spansy/src/json/types.rs

Lines changed: 131 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::ops::{Index, Range};
22

3-
use utils::range::{RangeDifference, RangeSet};
3+
use utils::range::{RangeDifference, RangeSet, ToRangeSet};
44

55
use crate::{Span, Spanned};
66

@@ -58,19 +58,6 @@ impl JsonValue {
5858
}
5959
}
6060

61-
impl Spanned<str> for JsonValue {
62-
fn span(&self) -> &Span<str> {
63-
match self {
64-
JsonValue::Null(v) => v.span(),
65-
JsonValue::Bool(v) => v.span(),
66-
JsonValue::Number(v) => v.span(),
67-
JsonValue::String(v) => v.span(),
68-
JsonValue::Array(v) => v.span(),
69-
JsonValue::Object(v) => v.span(),
70-
}
71-
}
72-
}
73-
7461
impl JsonValue {
7562
/// Get a reference to the value using the given path.
7663
///
@@ -98,6 +85,109 @@ impl JsonValue {
9885
}
9986
}
10087

88+
impl Spanned<str> for JsonValue {
89+
fn span(&self) -> &Span<str> {
90+
match self {
91+
JsonValue::Null(v) => v.span(),
92+
JsonValue::Bool(v) => v.span(),
93+
JsonValue::Number(v) => v.span(),
94+
JsonValue::String(v) => v.span(),
95+
JsonValue::Array(v) => v.span(),
96+
JsonValue::Object(v) => v.span(),
97+
}
98+
}
99+
}
100+
101+
impl AsRef<str> for JsonValue {
102+
fn as_ref(&self) -> &str {
103+
match self {
104+
JsonValue::Null(v) => v.as_ref(),
105+
JsonValue::Bool(v) => v.as_ref(),
106+
JsonValue::Number(v) => v.as_ref(),
107+
JsonValue::String(v) => v.as_ref(),
108+
JsonValue::Array(v) => v.as_ref(),
109+
JsonValue::Object(v) => v.as_ref(),
110+
}
111+
}
112+
}
113+
114+
impl AsRef<[u8]> for JsonValue {
115+
fn as_ref(&self) -> &[u8] {
116+
match self {
117+
JsonValue::Null(v) => v.as_ref(),
118+
JsonValue::Bool(v) => v.as_ref(),
119+
JsonValue::Number(v) => v.as_ref(),
120+
JsonValue::String(v) => v.as_ref(),
121+
JsonValue::Array(v) => v.as_ref(),
122+
JsonValue::Object(v) => v.as_ref(),
123+
}
124+
}
125+
}
126+
127+
impl AsRef<RangeSet<usize>> for JsonValue {
128+
fn as_ref(&self) -> &RangeSet<usize> {
129+
match self {
130+
JsonValue::Null(v) => v.as_ref(),
131+
JsonValue::Bool(v) => v.as_ref(),
132+
JsonValue::Number(v) => v.as_ref(),
133+
JsonValue::String(v) => v.as_ref(),
134+
JsonValue::Array(v) => v.as_ref(),
135+
JsonValue::Object(v) => v.as_ref(),
136+
}
137+
}
138+
}
139+
140+
impl ToRangeSet<usize> for JsonValue {
141+
fn to_range_set(&self) -> RangeSet<usize> {
142+
match self {
143+
JsonValue::Null(v) => v.to_range_set(),
144+
JsonValue::Bool(v) => v.to_range_set(),
145+
JsonValue::Number(v) => v.to_range_set(),
146+
JsonValue::String(v) => v.to_range_set(),
147+
JsonValue::Array(v) => v.to_range_set(),
148+
JsonValue::Object(v) => v.to_range_set(),
149+
}
150+
}
151+
}
152+
153+
impl PartialEq<str> for JsonValue {
154+
fn eq(&self, other: &str) -> bool {
155+
match self {
156+
JsonValue::Null(v) => v == other,
157+
JsonValue::Bool(v) => v == other,
158+
JsonValue::Number(v) => v == other,
159+
JsonValue::String(v) => v == other,
160+
JsonValue::Array(v) => v == other,
161+
JsonValue::Object(v) => v == other,
162+
}
163+
}
164+
}
165+
166+
impl PartialEq<JsonValue> for str {
167+
fn eq(&self, other: &JsonValue) -> bool {
168+
other == self
169+
}
170+
}
171+
172+
impl PartialEq<&str> for JsonValue {
173+
fn eq(&self, other: &&str) -> bool {
174+
match self {
175+
JsonValue::Null(v) => v == other,
176+
JsonValue::Bool(v) => v == other,
177+
JsonValue::Number(v) => v == other,
178+
JsonValue::String(v) => v == other,
179+
JsonValue::Array(v) => v == other,
180+
JsonValue::Object(v) => v == other,
181+
}
182+
}
183+
}
184+
185+
impl PartialEq<JsonValue> for &str {
186+
fn eq(&self, other: &JsonValue) -> bool {
187+
other == self
188+
}
189+
}
190+
101191
/// A key value pair in a JSON object.
102192
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
103193
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -266,6 +356,30 @@ macro_rules! impl_type {
266356
}
267357
}
268358

359+
impl AsRef<str> for $ty {
360+
fn as_ref(&self) -> &str {
361+
self.$span.as_ref()
362+
}
363+
}
364+
365+
impl AsRef<[u8]> for $ty {
366+
fn as_ref(&self) -> &[u8] {
367+
self.$span.as_ref()
368+
}
369+
}
370+
371+
impl AsRef<RangeSet<usize>> for $ty {
372+
fn as_ref(&self) -> &RangeSet<usize> {
373+
&self.$span.indices
374+
}
375+
}
376+
377+
impl ToRangeSet<usize> for $ty {
378+
fn to_range_set(&self) -> RangeSet<usize> {
379+
self.$span.indices.clone()
380+
}
381+
}
382+
269383
impl PartialEq<str> for $ty {
270384
fn eq(&self, other: &str) -> bool {
271385
self.$span == other
@@ -339,7 +453,7 @@ mod tests {
339453

340454
let value = parse_str(src).unwrap();
341455

342-
assert_eq!(value.get("foo").unwrap().span(), "bar");
456+
assert_eq!(value.get("foo").unwrap(), "bar");
343457
}
344458

345459
#[test]
@@ -348,7 +462,7 @@ mod tests {
348462

349463
let value = parse_str(src).unwrap();
350464

351-
assert_eq!(value.get("foo.1").unwrap().span(), "14");
465+
assert_eq!(value.get("foo.1").unwrap(), "14");
352466
}
353467

354468
#[test]
@@ -357,7 +471,7 @@ mod tests {
357471

358472
let value = parse_str(src).unwrap();
359473

360-
assert_eq!(value.get("foo.bar.1").unwrap().span(), "14");
474+
assert_eq!(value.get("foo.bar.1").unwrap(), "14");
361475
}
362476

363477
#[test]

0 commit comments

Comments
 (0)