Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 168 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,185 @@ members = ["csv-core", "csv-index"]
[lib]
bench = false

# Allow for needless main in doctest, as some examples are tutorials.
[lints.clippy]
needless_doctest_main = "allow"
upper_case_acronyms = "allow"

[dependencies]
csv-core = { path = "csv-core", version = "0.1.11" }
itoa = "1"
ryu = "1"
serde_core = "1.0.221"
serde_core = {version = "1.0.221", optional = true }

[dev-dependencies]
bstr = { version = "1.7.0", default-features = false, features = ["alloc", "serde"] }
serde = { version = "1.0.221", features = ["derive"] }

[features]
default = ["serde"]
serde = ["dep:serde_core"]

[profile.release]
debug = true

[profile.bench]
debug = true

[[example]]
name = "cookbook-read-basic"
path = "examples/cookbook-read-basic.rs"

[[example]]
name = "cookbook-read-colon"
path = "examples/cookbook-read-colon.rs"

[[example]]
name = "cookbook-read-no-headers"
path = "examples/cookbook-read-no-headers.rs"

[[example]]
name = "cookbook-read-serde"
path = "examples/cookbook-read-serde.rs"
required-features = ["serde"]

[[example]]
name = "cookbook-write-basic"
path = "examples/cookbook-write-basic.rs"

[[example]]
name = "cookbook-write-serde"
path = "examples/cookbook-write-serde.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-error-01"
path = "examples/tutorial-error-01.rs"

[[example]]
name = "tutorial-error-02"
path = "examples/tutorial-error-02.rs"

[[example]]
name = "tutorial-error-03"
path = "examples/tutorial-error-03.rs"

[[example]]
name = "tutorial-error-04"
path = "examples/tutorial-error-04.rs"

[[example]]
name = "tutorial-perf-alloc-01"
path = "examples/tutorial-perf-alloc-01.rs"

[[example]]
name = "tutorial-perf-alloc-02"
path = "examples/tutorial-perf-alloc-02.rs"

[[example]]
name = "tutorial-perf-alloc-03"
path = "examples/tutorial-perf-alloc-03.rs"

[[example]]
name = "tutorial-perf-core-01"
path = "examples/tutorial-perf-core-01.rs"

[[example]]
name = "tutorial-perf-serde-01"
path = "examples/tutorial-perf-serde-01.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-perf-serde-02"
path = "examples/tutorial-perf-serde-02.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-perf-serde-03"
path = "examples/tutorial-perf-serde-03.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-pipeline-pop-01"
path = "examples/tutorial-pipeline-pop-01.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-pipeline-search-01"
path = "examples/tutorial-pipeline-search-01.rs"

[[example]]
name = "tutorial-pipeline-search-02"
path = "examples/tutorial-pipeline-search-02.rs"

[[example]]
name = "tutorial-read-01"
path = "examples/tutorial-read-01.rs"

[[example]]
name = "tutorial-read-delimiter-01"
path = "examples/tutorial-read-delimiter-01.rs"

[[example]]
name = "tutorial-read-headers-01"
path = "examples/tutorial-read-headers-01.rs"

[[example]]
name = "tutorial-read-headers-02"
path = "examples/tutorial-read-headers-02.rs"

[[example]]
name = "tutorial-read-serde-01"
path = "examples/tutorial-read-serde-01.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-read-serde-02"
path = "examples/tutorial-read-serde-02.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-read-serde-03"
path = "examples/tutorial-read-serde-03.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-read-serde-04"
path = "examples/tutorial-read-serde-04.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-read-serde-invalid-01"
path = "examples/tutorial-read-serde-invalid-01.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-read-serde-invalid-02"
path = "examples/tutorial-read-serde-invalid-02.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-setup-01"
path = "examples/tutorial-setup-01.rs"

[[example]]
name = "tutorial-write-01"
path = "examples/tutorial-write-01.rs"

[[example]]
name = "tutorial-write-02"
path = "examples/tutorial-write-02.rs"

[[example]]
name = "tutorial-write-delimiter-01"
path = "examples/tutorial-write-delimiter-01.rs"

[[example]]
name = "tutorial-write-serde-01"
path = "examples/tutorial-write-serde-01.rs"
required-features = ["serde"]

[[example]]
name = "tutorial-write-serde-02"
path = "examples/tutorial-write-serde-02.rs"
required-features = ["serde"]
4 changes: 2 additions & 2 deletions ci/check-copy
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ SOURCE="$1"

errored() {
rm -rf "$TMPDIR"
echo "HINT: please run scripts/copy-examples" >&2
echo "HINT: please run scripts/copy-examples.py" >&2
exit 1
}

# Make sure the right rustfmt config is available.
cp "$REPO/rustfmt.toml" "$TMPDIR/"
"$SCRIPTS/copy-examples" \
"$SCRIPTS/copy-examples.py" \
--rust-file "$REPO/src/$SOURCE.rs" \
--example-dir "$TMPDIR"
for new in "$TMPDIR"/*.rs; do
Expand Down
1 change: 1 addition & 0 deletions ci/script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ if [ "$TRAVIS_RUST_VERSION" = "1.33.0" ]; then
fi

cargo test --verbose
cargo test --verbose --no-default-features
cargo test --verbose --manifest-path csv-core/Cargo.toml
cargo test --verbose --manifest-path csv-index/Cargo.toml
if [ "$TRAVIS_RUST_VERSION" = "stable" ]; then
Expand Down
8 changes: 1 addition & 7 deletions csv-core/src/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ impl fmt::Debug for Writer {
}
}

#[derive(Clone, Debug)]
#[derive(Clone, Debug, Default)]
struct WriterState {
/// This is set whenever we've begun writing the contents of a field, even
/// if the contents are empty. We use it to avoid re-computing whether
Expand Down Expand Up @@ -496,12 +496,6 @@ impl Default for Writer {
}
}

impl Default for WriterState {
fn default() -> WriterState {
WriterState { in_field: false, quoting: false, record_bytes: 0 }
}
}

/// Returns true if and only if the given input is non-numeric.
pub fn is_non_numeric(input: &[u8]) -> bool {
let s = match str::from_utf8(input) {
Expand Down
11 changes: 8 additions & 3 deletions examples/cookbook-read-serde.rs
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
#![allow(dead_code)]
use std::{error::Error, io, process};

use serde::Deserialize;

#[cfg(feature = "serde")]
// By default, struct field names are deserialized based on the position of
// a corresponding field in the CSV data's header record.
#[derive(Debug, Deserialize)]
#[derive(Debug, serde::Deserialize)]
struct Record {
city: String,
region: String,
country: String,
population: Option<u64>,
}

#[cfg(feature = "serde")]
fn example() -> Result<(), Box<dyn Error>> {
let mut rdr = csv::Reader::from_reader(io::stdin());
for result in rdr.deserialize() {
Expand All @@ -24,9 +24,14 @@ fn example() -> Result<(), Box<dyn Error>> {
Ok(())
}

#[cfg(feature = "serde")]
fn main() {
if let Err(err) = example() {
println!("error running example: {}", err);
process::exit(1);
}
}
#[cfg(not(feature = "serde"))]
fn main() {
println!("this example requires the 'serde' feature");
}
11 changes: 8 additions & 3 deletions examples/cookbook-write-serde.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
use std::{error::Error, io, process};

use serde::Serialize;

#[derive(Debug, Serialize)]
#[cfg(feature = "serde")]
#[derive(Debug, serde::Serialize)]
struct Record {
city: String,
region: String,
country: String,
population: Option<u64>,
}

#[cfg(feature = "serde")]
fn example() -> Result<(), Box<dyn Error>> {
let mut wtr = csv::Writer::from_writer(io::stdout());

Expand All @@ -31,9 +31,14 @@ fn example() -> Result<(), Box<dyn Error>> {
Ok(())
}

#[cfg(feature = "serde")]
fn main() {
if let Err(err) = example() {
println!("error running example: {}", err);
process::exit(1);
}
}
#[cfg(not(feature = "serde"))]
fn main() {
println!("this example requires the 'serde' feature");
}
11 changes: 8 additions & 3 deletions examples/tutorial-perf-serde-01.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
#![allow(dead_code)]
use std::{error::Error, io, process};

use serde::Deserialize;

#[derive(Debug, Deserialize)]
#[cfg(feature = "serde")]
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Record {
country: String,
Expand All @@ -15,6 +14,7 @@ struct Record {
longitude: f64,
}

#[cfg(feature = "serde")]
fn run() -> Result<u64, Box<dyn Error>> {
let mut rdr = csv::Reader::from_reader(io::stdin());

Expand All @@ -28,6 +28,7 @@ fn run() -> Result<u64, Box<dyn Error>> {
Ok(count)
}

#[cfg(feature = "serde")]
fn main() {
match run() {
Ok(count) => {
Expand All @@ -39,3 +40,7 @@ fn main() {
}
}
}
#[cfg(not(feature = "serde"))]
fn main() {
println!("this example requires the 'serde' feature");
}
11 changes: 8 additions & 3 deletions examples/tutorial-perf-serde-02.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
#![allow(dead_code)]
use serde::Deserialize;
use std::{error::Error, io, process};

#[derive(Debug, Deserialize)]
#[cfg(feature = "serde")]
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Record<'a> {
country: &'a str,
Expand All @@ -14,6 +13,7 @@ struct Record<'a> {
longitude: f64,
}

#[cfg(feature = "serde")]
fn run() -> Result<u64, Box<dyn Error>> {
let mut rdr = csv::Reader::from_reader(io::stdin());
let mut raw_record = csv::StringRecord::new();
Expand All @@ -29,6 +29,7 @@ fn run() -> Result<u64, Box<dyn Error>> {
Ok(count)
}

#[cfg(feature = "serde")]
fn main() {
match run() {
Ok(count) => {
Expand All @@ -40,3 +41,7 @@ fn main() {
}
}
}
#[cfg(not(feature = "serde"))]
fn main() {
println!("this example requires the 'serde' feature");
}
Loading