Squashed 'third_party/rules_rust/' content from commit bf59038ca

git-subtree-dir: third_party/rules_rust
git-subtree-split: bf59038cac11798cbaef9f3bf965bad8182b97fa
Signed-off-by: Brian Silverman <bsilver16384@gmail.com>
Change-Id: I5a20e403203d670df467ea97dde9a4ac40339a8d
diff --git a/crate_universe/src/cli.rs b/crate_universe/src/cli.rs
new file mode 100644
index 0000000..2ed27ac
--- /dev/null
+++ b/crate_universe/src/cli.rs
@@ -0,0 +1,42 @@
+//! Command line interface entry points and utilities
+
+mod generate;
+mod query;
+mod splice;
+mod vendor;
+
+use clap::Parser;
+
+use self::generate::GenerateOptions;
+use self::query::QueryOptions;
+use self::splice::SpliceOptions;
+use self::vendor::VendorOptions;
+
+// Entrypoints
+pub use generate::generate;
+pub use query::query;
+pub use splice::splice;
+pub use vendor::vendor;
+
+#[derive(Parser, Debug)]
+#[clap(name = "cargo-bazel", about, version)]
+pub enum Options {
+    /// Generate Bazel Build files from a Cargo manifest.
+    Generate(GenerateOptions),
+
+    /// Splice together disjoint Cargo and Bazel info into a single Cargo workspace manifest.
+    Splice(SpliceOptions),
+
+    /// Query workspace info to determine whether or not a repin is needed.
+    Query(QueryOptions),
+
+    /// Vendor BUILD files to the workspace with either repository definitions or `cargo vendor` generated sources.
+    Vendor(VendorOptions),
+}
+
+// Convenience wrappers to avoid dependencies in the binary
+pub type Result<T> = anyhow::Result<T>;
+
+pub fn parse_args() -> Options {
+    Options::parse()
+}