Skip to content

Commit c240586

Browse files
authored
Cleanup deps (#137)
Remove dependencies where possible. - The byteorder crate can be replaced by the std {to,from}_{le,be}_bytes since rust 1.32.0. - The time crate can be replaced with SystemTime. - The libc and md5 crates were not used at all. - Remove features not needed from chrono - the hex dependency was outdated **BREAKING CHANGE**: Requires at least Rust 1.32.0
1 parent ac0dd45 commit c240586

File tree

6 files changed

+65
-48
lines changed

6 files changed

+65
-48
lines changed

Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,12 @@ decimal128 = ["decimal"]
2525
name = "bson"
2626

2727
[dependencies]
28-
byteorder = "1"
2928
chrono = "0.4"
30-
libc = "0.2"
3129
rand = "0.7"
3230
serde = { version = "1.0", features = ["derive"] }
3331
serde_json = { version = "1.0", features = ["preserve_order"] }
3432
linked-hash-map = "0.5.3"
3533
hex = "0.4.2"
36-
md5 = "0.7.0"
3734
decimal = { version = "2.0.4", default_features = false, optional = true }
3835
base64 = "0.12.1"
3936
lazy_static = "1.4.0"

src/de/mod.rs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ pub use self::{
3131

3232
use std::io::Read;
3333

34-
use byteorder::{LittleEndian, ReadBytesExt};
3534
use chrono::{
3635
offset::{LocalResult, TimeZone},
3736
Utc,
@@ -79,7 +78,7 @@ where
7978
}
8079

8180
fn read_string<R: Read + ?Sized>(reader: &mut R, utf8_lossy: bool) -> Result<String> {
82-
let len = reader.read_i32::<LittleEndian>()?;
81+
let len = read_i32(reader)?;
8382

8483
// UTF-8 String must have at least 1 byte (the last 0x00).
8584
if len < 1 {
@@ -100,7 +99,7 @@ fn read_string<R: Read + ?Sized>(reader: &mut R, utf8_lossy: bool) -> Result<Str
10099
};
101100

102101
// read the null terminator
103-
if reader.read_u8()? != 0 {
102+
if read_u8(reader)? != 0 {
104103
return Err(Error::invalid_length(
105104
len as usize,
106105
&"contents of string longer than provided length",
@@ -114,7 +113,7 @@ fn read_cstring<R: Read + ?Sized>(reader: &mut R) -> Result<String> {
114113
let mut v = Vec::new();
115114

116115
loop {
117-
let c = reader.read_u8()?;
116+
let c = read_u8(reader)?;
118117
if c == 0 {
119118
break;
120119
}
@@ -124,14 +123,32 @@ fn read_cstring<R: Read + ?Sized>(reader: &mut R) -> Result<String> {
124123
Ok(String::from_utf8(v)?)
125124
}
126125

126+
#[inline]
127+
fn read_u8<R: Read + ?Sized>(reader: &mut R) -> Result<u8> {
128+
let mut buf = [0; 1];
129+
reader.read_exact(&mut buf)?;
130+
Ok(u8::from_le_bytes(buf))
131+
}
132+
127133
#[inline]
128134
pub(crate) fn read_i32<R: Read + ?Sized>(reader: &mut R) -> Result<i32> {
129-
reader.read_i32::<LittleEndian>().map_err(From::from)
135+
let mut buf = [0; 4];
136+
reader.read_exact(&mut buf)?;
137+
Ok(i32::from_le_bytes(buf))
130138
}
131139

132140
#[inline]
133141
fn read_i64<R: Read + ?Sized>(reader: &mut R) -> Result<i64> {
134-
reader.read_i64::<LittleEndian>().map_err(From::from)
142+
let mut buf = [0; 8];
143+
reader.read_exact(&mut buf)?;
144+
Ok(i64::from_le_bytes(buf))
145+
}
146+
147+
#[inline]
148+
fn read_f64<R: Read + ?Sized>(reader: &mut R) -> Result<f64> {
149+
let mut buf = [0; 8];
150+
reader.read_exact(&mut buf)?;
151+
Ok(f64::from_le_bytes(buf))
135152
}
136153

137154
/// Placeholder decoder for `Decimal128`. Reads 128 bits and just stores them, does no validation or
@@ -165,7 +182,7 @@ fn deserialize_array<R: Read + ?Sized>(reader: &mut R, utf8_lossy: bool) -> Resu
165182
"array length longer than contents",
166183
|cursor| {
167184
loop {
168-
let tag = cursor.read_u8()?;
185+
let tag = read_u8(cursor)?;
169186
if tag == 0 {
170187
break;
171188
}
@@ -189,7 +206,7 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
189206
let key = read_cstring(reader)?;
190207

191208
let val = match ElementType::from(tag) {
192-
Some(ElementType::Double) => Bson::Double(reader.read_f64::<LittleEndian>()?),
209+
Some(ElementType::Double) => Bson::Double(read_f64(reader)?),
193210
Some(ElementType::String) => read_string(reader, utf8_lossy).map(Bson::String)?,
194211
Some(ElementType::EmbeddedDocument) => Document::from_reader(reader).map(Bson::Document)?,
195212
Some(ElementType::Array) => deserialize_array(reader, utf8_lossy).map(Bson::Array)?,
@@ -201,7 +218,7 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
201218
&format!("binary length must be between 0 and {}", MAX_BSON_SIZE).as_str(),
202219
));
203220
}
204-
let subtype = BinarySubtype::from(reader.read_u8()?);
221+
let subtype = BinarySubtype::from(read_u8(reader)?);
205222

206223
// Skip length data in old binary.
207224
if let BinarySubtype::BinaryOld = subtype {
@@ -225,12 +242,12 @@ pub(crate) fn deserialize_bson_kvp<R: Read + ?Sized>(
225242
Some(ElementType::ObjectId) => {
226243
let mut objid = [0; 12];
227244
for x in &mut objid {
228-
*x = reader.read_u8()?;
245+
*x = read_u8(reader)?;
229246
}
230247
Bson::ObjectId(oid::ObjectId::with_bytes(objid))
231248
}
232249
Some(ElementType::Boolean) => {
233-
let val = reader.read_u8()?;
250+
let val = read_u8(reader)?;
234251
if val > 1 {
235252
return Err(Error::invalid_value(
236253
Unexpected::Unsigned(val as u64),

src/document.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ use std::{
99
mem,
1010
};
1111

12-
use byteorder::{ReadBytesExt, WriteBytesExt};
13-
1412
use chrono::{DateTime, Utc};
1513

1614
use linked_hash_map::{self, LinkedHashMap};
@@ -522,7 +520,7 @@ impl Document {
522520
(buf.len() + mem::size_of::<i32>() + mem::size_of::<u8>()) as i32,
523521
)?;
524522
writer.write_all(&buf)?;
525-
writer.write_u8(0)?;
523+
writer.write_all(&[0])?;
526524
Ok(())
527525
}
528526

@@ -544,7 +542,9 @@ impl Document {
544542
"document length longer than contents",
545543
|cursor| {
546544
loop {
547-
let tag = cursor.read_u8()?;
545+
let mut tag_byte = [0];
546+
cursor.read_exact(&mut tag_byte)?;
547+
let tag = tag_byte[0];
548548

549549
if tag == 0 {
550550
break;

src/oid.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,10 @@ use std::{
99
time::SystemTime,
1010
};
1111

12-
use byteorder::{BigEndian, ByteOrder};
13-
12+
use chrono::Utc;
1413
use hex::{self, FromHexError};
15-
1614
use rand::{thread_rng, Rng};
1715

18-
use chrono::Utc;
1916
use lazy_static::lazy_static;
2017

2118
const TIMESTAMP_SIZE: usize = 4;
@@ -123,7 +120,10 @@ impl ObjectId {
123120

124121
/// Retrieves the timestamp (chrono::DateTime) from an ObjectId.
125122
pub fn timestamp(&self) -> chrono::DateTime<Utc> {
126-
let seconds_since_epoch = BigEndian::read_u32(&self.id);
123+
let mut buf = [0; 4];
124+
buf.copy_from_slice(&self.id[0..4]);
125+
let seconds_since_epoch = u32::from_be_bytes(buf);
126+
127127
let naive_datetime = chrono::NaiveDateTime::from_timestamp(seconds_since_epoch as i64, 0);
128128
let timestamp: chrono::DateTime<Utc> = chrono::DateTime::from_utc(naive_datetime, Utc);
129129
timestamp
@@ -142,23 +142,20 @@ impl ObjectId {
142142
// Generates a new timestamp representing the current seconds since epoch.
143143
// Represented in Big Endian.
144144
fn gen_timestamp() -> [u8; 4] {
145-
let timestamp = SystemTime::now()
145+
let timestamp: u32 = SystemTime::now()
146146
.duration_since(SystemTime::UNIX_EPOCH)
147147
.expect("system clock is before 1970")
148148
.as_secs()
149149
.try_into()
150150
.unwrap(); // will succeed until 2106 since timestamp is unsigned
151-
152-
let mut buf: [u8; 4] = [0; 4];
153-
BigEndian::write_u32(&mut buf, timestamp);
154-
buf
151+
timestamp.to_be_bytes()
155152
}
156153

157154
// Generate a random 5-byte array.
158155
fn gen_process_id() -> [u8; 5] {
159156
let rng = thread_rng().gen_range(0, MAX_U24) as u32;
160157
let mut buf: [u8; 5] = [0; 5];
161-
BigEndian::write_u32(&mut buf, rng);
158+
buf[0..4].copy_from_slice(&rng.to_be_bytes());
162159
buf
163160
}
164161

@@ -173,8 +170,7 @@ impl ObjectId {
173170
// Convert usize to writable u64, then extract the first three bytes.
174171
let u_int = u as u64;
175172

176-
let mut buf: [u8; 8] = [0; 8];
177-
BigEndian::write_u64(&mut buf, u_int);
173+
let buf = u_int.to_be_bytes();
178174
let buf_u24: [u8; 3] = [buf[5], buf[6], buf[7]];
179175
buf_u24
180176
}
@@ -207,7 +203,7 @@ fn count_generated_is_big_endian() {
207203
let mut buf: [u8; 4] = [0; 4];
208204
buf[1..=COUNTER_SIZE].clone_from_slice(&count_bytes[..COUNTER_SIZE]);
209205

210-
let count = BigEndian::read_u32(&buf);
206+
let count = u32::from_be_bytes(buf);
211207
assert_eq!(start as u32, count);
212208

213209
// Test OID formats count correctly as big endian

src/ser/mod.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ pub use self::{
3131

3232
use std::{io::Write, mem};
3333

34-
use byteorder::{LittleEndian, WriteBytesExt};
3534
use chrono::Timelike;
3635

3736
#[cfg(feature = "decimal128")]
@@ -43,31 +42,40 @@ use crate::{
4342
use ::serde::Serialize;
4443

4544
fn write_string<W: Write + ?Sized>(writer: &mut W, s: &str) -> Result<()> {
46-
writer.write_i32::<LittleEndian>(s.len() as i32 + 1)?;
45+
writer.write_all(&(s.len() as i32 + 1).to_le_bytes())?;
4746
writer.write_all(s.as_bytes())?;
48-
writer.write_u8(0)?;
47+
writer.write_all(b"\0")?;
4948
Ok(())
5049
}
5150

5251
fn write_cstring<W: Write + ?Sized>(writer: &mut W, s: &str) -> Result<()> {
5352
writer.write_all(s.as_bytes())?;
54-
writer.write_u8(0)?;
53+
writer.write_all(b"\0")?;
5554
Ok(())
5655
}
5756

5857
#[inline]
5958
pub(crate) fn write_i32<W: Write + ?Sized>(writer: &mut W, val: i32) -> Result<()> {
60-
writer.write_i32::<LittleEndian>(val).map_err(From::from)
59+
writer
60+
.write_all(&val.to_le_bytes())
61+
.map(|_| ())
62+
.map_err(From::from)
6163
}
6264

6365
#[inline]
6466
fn write_i64<W: Write + ?Sized>(writer: &mut W, val: i64) -> Result<()> {
65-
writer.write_i64::<LittleEndian>(val).map_err(From::from)
67+
writer
68+
.write_all(&val.to_le_bytes())
69+
.map(|_| ())
70+
.map_err(From::from)
6671
}
6772

6873
#[inline]
6974
fn write_f64<W: Write + ?Sized>(writer: &mut W, val: f64) -> Result<()> {
70-
writer.write_f64::<LittleEndian>(val).map_err(From::from)
75+
writer
76+
.write_all(&val.to_le_bytes())
77+
.map(|_| ())
78+
.map_err(From::from)
7179
}
7280

7381
#[cfg(feature = "decimal128")]
@@ -88,7 +96,7 @@ fn serialize_array<W: Write + ?Sized>(writer: &mut W, arr: &[Bson]) -> Result<()
8896
(buf.len() + mem::size_of::<i32>() + mem::size_of::<u8>()) as i32,
8997
)?;
9098
writer.write_all(&buf)?;
91-
writer.write_u8(0)?;
99+
writer.write_all(b"\0")?;
92100
Ok(())
93101
}
94102

@@ -97,7 +105,7 @@ pub(crate) fn serialize_bson<W: Write + ?Sized>(
97105
key: &str,
98106
val: &Bson,
99107
) -> Result<()> {
100-
writer.write_u8(val.element_type() as u8)?;
108+
writer.write_all(&[val.element_type() as u8])?;
101109
write_cstring(writer, key)?;
102110

103111
match *val {
@@ -106,7 +114,7 @@ pub(crate) fn serialize_bson<W: Write + ?Sized>(
106114
Bson::Array(ref v) => serialize_array(writer, &v),
107115
Bson::Document(ref v) => v.to_writer(writer),
108116
Bson::Boolean(v) => writer
109-
.write_u8(if v { 0x01 } else { 0x00 })
117+
.write_all(&[if v { 0x01 } else { 0x00 }])
110118
.map_err(From::from),
111119
Bson::RegularExpression(Regex {
112120
ref pattern,
@@ -139,7 +147,7 @@ pub(crate) fn serialize_bson<W: Write + ?Sized>(
139147
};
140148

141149
write_i32(writer, len as i32)?;
142-
writer.write_u8(From::from(subtype))?;
150+
writer.write_all(&[subtype.into()])?;
143151

144152
if let BinarySubtype::BinaryOld = subtype {
145153
write_i32(writer, len as i32 - 4)?;

src/tests/modules/serializer_deserializer.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use crate::{
1717
Regex,
1818
Timestamp,
1919
};
20-
use byteorder::{LittleEndian, WriteBytesExt};
2120
use chrono::{offset::TimeZone, Utc};
2221
use serde_json::json;
2322

@@ -333,16 +332,16 @@ fn test_serialize_deserialize_symbol() {
333332
#[test]
334333
fn test_deserialize_utc_date_time_overflows() {
335334
let _guard = LOCK.run_concurrently();
336-
let t = 1_530_492_218 * 1_000 + 999;
335+
let t: i64 = 1_530_492_218 * 1_000 + 999;
337336

338337
let mut raw0 = vec![0x09, b'A', 0x00];
339-
raw0.write_i64::<LittleEndian>(t).unwrap();
338+
raw0.write_all(&t.to_le_bytes()).unwrap();
340339

341340
let mut raw = vec![];
342-
raw.write_i32::<LittleEndian>((raw0.len() + 4 + 1) as i32)
341+
raw.write_all(&((raw0.len() + 4 + 1) as i32).to_le_bytes())
343342
.unwrap();
344343
raw.write_all(&raw0).unwrap();
345-
raw.write_u8(0).unwrap();
344+
raw.write_all(&[0]).unwrap();
346345

347346
let deserialized = Document::from_reader(&mut Cursor::new(raw)).unwrap();
348347

0 commit comments

Comments
 (0)