Editor's note: The code in this question is from a version of Rust prior to 1.0. The underlying system of how enums are imported was changed for Rust 1.0.
This seems like it should be easy (emulating C/C++ enums), but I can't get it to work. I simply want to use an enum from a crate, but this doesn't seem to work no matter what I try. Am I missing something about Rust enums (can they not be used like old C/C++ enums)?
log/mod.rs:
pub enum Level {
Debug,
Normal,
}
pub struct Log {
pub log_level: Level,
}
main.rs:
extern crate project;
use project::log::{Log, Level};
fn main() {
// error: unresolved name `Normal`.
let logger = Log { log_level: Normal };
// unresolved name `Level::Normal`.
let logger = Log { log_level: Level::Normal };
// unresolved name `log::Level::Normal`.
let logger = Log { log_level: log::Level::Normal };
// unresolved name `project::log::Level::Normal`.
let logger = Log { log_level: project::log::Level::Normal };
}
Enum variants are now namespaced under the enum name. These two options work as-is:
extern crate project;
use project::log::{Level, Log};
fn main() {
let logger = Log {
log_level: Level::Normal,
};
let logger = Log {
log_level: project::log::Level::Normal,
};
}
You can also import the module:
extern crate project;
use project::log;
fn main() {
let logger = log::Log {
log_level: log::Level::Normal,
};
}
Or you can even import all enum variants:
extern crate project;
use project::log::{Log, Level::*};
fn main() {
let logger = Log {
log_level: Normal,
};
}
You need to import each enum variant by name, not just the name of the enumeration, in order to use its unqualified name. Change the second line in main.rs to
use project::log::{Log, Debug, Normal};
Alternately, you can use the qualified name, without the Level::
part of the path, since enum variants aren't namespaced like C++ enum classes are.
use project::log;
... Log { log_level: log::Normal };