Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New defaults to bin #5029

Merged
merged 3 commits into from
Feb 13, 2018
Merged
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
17 changes: 7 additions & 10 deletions src/bin/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Options:
control system (git, hg, pijul, or fossil) or do not
initialize any version control at all (none), overriding
a global configuration.
--bin Use a binary (application) template
--lib Use a library template [default]
--bin Use a binary (application) template [default]
--lib Use a library template
--name NAME Set the resulting package name
-v, --verbose ... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet No output printed to stdout
Expand All @@ -56,17 +56,14 @@ pub fn execute(options: Options, config: &mut Config) -> CliResult {

let path = &arg_path.unwrap_or_else(|| String::from("."));
let opts = ops::NewOptions::new(flag_vcs,
flag_bin,
flag_lib,
path,
flag_name.as_ref().map(|s| s.as_ref()));
flag_bin,
flag_lib,
path,
flag_name.as_ref().map(|s| s.as_ref()))?;

let opts_lib = opts.lib;
ops::init(&opts, config)?;

config.shell().status("Created", format!("{} project",
if opts_lib { "library" }
else {"binary (application)"}))?;
config.shell().status("Created", format!("{} project", opts.kind))?;

Ok(())
}
Expand Down
12 changes: 4 additions & 8 deletions src/bin/new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Options:
control system (git, hg, pijul, or fossil) or do not
initialize any version control at all (none), overriding
a global configuration.
--bin Use a binary (application) template
--lib Use a library template [default]
--bin Use a binary (application) template [default]
--lib Use a library template
--name NAME Set the resulting package name, defaults to the value of <path>
-v, --verbose ... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet No output printed to stdout
Expand All @@ -58,15 +58,11 @@ pub fn execute(options: Options, config: &mut Config) -> CliResult {
flag_bin,
flag_lib,
&arg_path,
flag_name.as_ref().map(|s| s.as_ref()));
flag_name.as_ref().map(|s| s.as_ref()))?;

let opts_lib = opts.lib;
ops::new(&opts, config)?;

config.shell().status("Created", format!("{} `{}` project",
if opts_lib { "library" }
else {"binary (application)"},
arg_path))?;
config.shell().status("Created", format!("{} `{}` project", opts.kind, arg_path))?;

Ok(())
}
Expand Down
76 changes: 42 additions & 34 deletions src/cargo/ops/cargo_new.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::collections::BTreeMap;
use std::env;
use std::fs;
use std::fmt;
use std::path::Path;

use serde::{Deserialize, Deserializer};
Expand All @@ -23,12 +24,32 @@ pub enum VersionControl { Git, Hg, Pijul, Fossil, NoVcs }
#[derive(Debug)]
pub struct NewOptions<'a> {
pub version_control: Option<VersionControl>,
pub bin: bool,
pub lib: bool,
pub kind: NewProjectKind,
pub path: &'a str,
pub name: Option<&'a str>,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NewProjectKind {
Bin,
Lib,
}

impl NewProjectKind {
fn is_bin(&self) -> bool {
*self == NewProjectKind::Bin
}
}

impl fmt::Display for NewProjectKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
NewProjectKind::Bin => "binary (application)",
NewProjectKind::Lib => "library",
}.fmt(f)
}
}

struct SourceFileInformation {
relative_path: String,
target_name: String,
Expand Down Expand Up @@ -62,26 +83,21 @@ impl<'de> Deserialize<'de> for VersionControl {

impl<'a> NewOptions<'a> {
pub fn new(version_control: Option<VersionControl>,
bin: bool,
lib: bool,
path: &'a str,
name: Option<&'a str>) -> NewOptions<'a> {

// default to lib
let is_lib = if !bin {
true
}
else {
lib
bin: bool,
lib: bool,
path: &'a str,
name: Option<&'a str>) -> CargoResult<NewOptions<'a>> {

let kind = match (bin, lib) {
(true, true) => bail!("can't specify both lib and binary outputs"),
(true, false) => NewProjectKind::Bin,
(false, true) => NewProjectKind::Lib,
// default to bin
(false, false) => NewProjectKind::Bin,
};

NewOptions {
version_control: version_control,
bin: bin,
lib: is_lib,
path: path,
name: name,
}
let opts = NewOptions { version_control, kind, path, name };
Ok(opts)
}
}

Expand Down Expand Up @@ -127,7 +143,7 @@ fn check_name(name: &str, opts: &NewOptions) -> CargoResult<()> {
"super", "test", "trait", "true", "type", "typeof",
"unsafe", "unsized", "use", "virtual", "where",
"while", "yield"];
if blacklist.contains(&name) || (opts.bin && is_bad_artifact_name(name)) {
if blacklist.contains(&name) || (opts.kind.is_bin() && is_bad_artifact_name(name)) {
bail!("The name `{}` cannot be used as a crate name{}",
name,
name_help)
Expand Down Expand Up @@ -269,19 +285,15 @@ pub fn new(opts: &NewOptions, config: &Config) -> CargoResult<()> {
)
}

if opts.lib && opts.bin {
bail!("can't specify both lib and binary outputs")
}

let name = get_name(&path, opts)?;
check_name(name, opts)?;

let mkopts = MkOptions {
version_control: opts.version_control,
path: &path,
name: name,
source_files: vec![plan_new_source_file(opts.bin, name.to_string())],
bin: opts.bin,
source_files: vec![plan_new_source_file(opts.kind.is_bin(), name.to_string())],
bin: opts.kind.is_bin(),
};

mk(config, &mkopts).chain_err(|| {
Expand All @@ -299,10 +311,6 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
bail!("`cargo init` cannot be run on existing Cargo projects")
}

if opts.lib && opts.bin {
bail!("can't specify both lib and binary outputs");
}

let name = get_name(&path, opts)?;
check_name(name, opts)?;

Expand All @@ -311,7 +319,7 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
detect_source_paths_and_types(&path, name, &mut src_paths_types)?;

if src_paths_types.is_empty() {
src_paths_types.push(plan_new_source_file(opts.bin, name.to_string()));
src_paths_types.push(plan_new_source_file(opts.kind.is_bin(), name.to_string()));
} else {
// --bin option may be ignored if lib.rs or src/lib.rs present
// Maybe when doing `cargo init --bin` inside a library project stub,
Expand Down Expand Up @@ -353,9 +361,9 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
}

let mkopts = MkOptions {
version_control: version_control,
version_control,
path: &path,
name: name,
name,
bin: src_paths_types.iter().any(|x|x.bin),
source_files: src_paths_types,
};
Expand Down
2 changes: 1 addition & 1 deletion src/doc/src/getting-started/first-steps.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ $ cargo new hello_world --bin
```

We’re passing `--bin` because we’re making a binary program: if we
were making a library, we’d leave it off.
were making a library, we’d pass `--lib`.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think src/doc/src/guide/creating-a-new-project.md also needs to be updated, since it talks about --bin in more detail.


Let’s check out what Cargo has generated for us:

Expand Down
6 changes: 2 additions & 4 deletions src/doc/src/guide/creating-a-new-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ $ cargo new hello_world --bin
```

We’re passing `--bin` because we’re making a binary program: if we
were making a library, we’d leave it off. This also initializes a new `git`
were making a library, we’d pass `--lib`. This also initializes a new `git`
repository by default. If you don't want it to do that, pass `--vcs none`.

Let’s check out what Cargo has generated for us:
Expand All @@ -23,9 +23,7 @@ $ tree .
1 directory, 2 files
```

If we had just used `cargo new hello_world` without the `--bin` flag, then
we would have a `lib.rs` instead of a `main.rs`. For now, however, this is all
we need to get started. First, let’s check out `Cargo.toml`:
Let’s take a closer look at `Cargo.toml`:

```toml
[package]
Expand Down