- #360: Fixes bug introduced with new string interpolation feature where
unit structs took an implicit unnecessary dependency on
::core::alloc
.
- #344: Hide
EnumTable
because it's going to be deprecated in the next version. - #357: Fixes an incompatiblity with
itertools
by using the fully qualified name rather than the inherent method. - #345: Allows unnamed tuple like variants to use their variants in
string interpolation.
#[strum(to_string = "Field 0: {0}, Field 1: {1})")]
will now work for tuple variants
- #337: Fix missing generic impls for
EnumTryAs
- #334: Support prefix in
AsRefStr
. Technically a breaking change, butprefix
was just added in0.26.0
so it's a newer feature and it makes the feature more consisent in general.
- #325: use
core
instead ofstd
in VariantArray.
- The
EnumVariantNames
macro has been renamedVariantNames
. The deprecation warning should steer you in the right direction for fixing the warning. - The Iterator struct generated by EnumIter now has new bounds on it. This shouldn't break code unless you manually added the implementation in your code.
Display
now supports format strings using named fields in the enum variant. This should be a no-op for most code. However, if you were outputting a string like"Hello {field}"
, this will now be interpretted as a format string.- EnumDiscriminant now inherits the repr and discriminant values from your main enum. This makes the discriminant type closer to a mirror of the original and that's always the goal.
-
The
VariantArray
macro has been added. This macro adds an associated constantVARIANTS
to your enum. The constant is a&'static [Self]
slice so that you can access all the variants of your enum. This only works on enums that only have unit variants.use strum::VariantArray; #[derive(Debug, VariantArray)] enum Color { Red, Blue, Green, } fn main() { println!("{:?}", Color::VARIANTS); // prints: ["Red", "Blue", "Green"] }
-
The
EnumTable
macro has been experimentally added. This macro adds a new type that stores an item for each variant of the enum. This is useful for storing a value for each variant of an enum. This is an experimental feature because I'm not convinced the current api surface area is correct.use strum::EnumTable; #[derive(Copy, Clone, Debug, EnumTable)] enum Color { Red, Blue, Green, } fn main() { let mut counts = ColorTable::filled(0); for color in &[Color::Red, Color::Red, Color::Green]] { counts[color] += 1; } assert_eq!(counts[Color::Red], 2); assert_eq!(counts[Color::Blue], 0); assert_eq!(counts[Color::Green], 1); }
-
Display
has 2 new features:-
the
strum(prefix = "some_value")
attribute on an enum now allows you to prepend a string onto every variant when you serialize it. -
Custom
to_string
andserialize
attributes now support string interopolation on serialization.
-
- #322: avoid collisions on
std::fmt::Debug
- #321: avoid conflicts with consecutive underscores.
- #314: add additional bounds to EnumIterator
- #311: add FusedIterator bounds to EnumIterator
- #297: New macro, add
VariantArray
- #296: adds prefix attribute to To/From String macros.
- #294: use named enum fields in to_string macro.
- #288: discriminant enums now inherit the repr from the original enum.
- #279: Add
EnumTable
macro to generate a mapping between fieldless variants and data.
Received a number of bug fix PR's.
- #300: Fixes EnumIter for enums named
Option
. - #301: Improved doc comments
- #304: Removed some unused Vec's
- #305: Added generic support to
EnumIs
- #289: Enables a previously disabled rustdoc.
- #287: Fixes a bug in EnumIter code gen so that we produce
::core
to avoid issues with shadowing modules.
- #276. Fixes #275 and
#281. Not sure exactly why this broke, perhaps incompatibilities between
syn 1 and 2. PR fixes the issue by only looking at attributes of the "list" type
[attr(item, item)]
.
-
#261 Upgrade syn dependency to version 2. This bumps the msrv to 1.56. It's impractical to maintain a package where a core dependency of the ecosystem has a different msrv than this one.
-
270 Change the
to_string
behavior when usingdefault
. Now, when usingdefault
, thedisplay
method will return the display version of the value contained in the enum rather than the name of the variant.#[derive(strum::Display)] enum Color { Red, Blue, Green, #[strum(default)] Other(String) } fn main() { // This used to print "Other", now it prints "Purple" assert_eq!(Color::Other("Purple".to_string()).to_string(), "Purple"); }
If you want the old behavior, you can use the
to_string
attribute to override this behavior. See the PR for an example. -
268 Update the behavior of
EnumCount
to exclude variants that aredisabled
. This is a breaking change, but the behavior makes it more consistent with other methods.
-
#257 This PR adds the
EnumIs
macro that automatically implementsis_{variant_name}
methods for each variant.#[derive(EnumIs)] enum Color { Red, Blue, Green, } #[test] fn simple_test() { assert!(Color::Red.is_red()); }
- #231 Add ignore lints for EnumIter not implementing Copy or Debug on the generated iter struct. Copy should generally not be implemented on Iterators. Its an oversight that Debug isn't implemented, but it will be a breaking change to add that so it'll be added in a future version.
-
#220. Add support for PHF in
EnumString
(opt-in runtime performance improvements for large enums as#[strum(use_phf)]
, requiresphf
feature and increases MSRV to1.46
)- #224 tweaked the algorithm.
-
Reverted #217 because it was disruptive and non-trivial to work around if you hit it.
- #220. Add support for PHF in
EnumString
(opt-in runtime performance improvements for large enums as#[strum(use_phf)]
, requiresphf
feature and increases MSRV to1.46
)- #224 tweaked the algorithm.
- #217: Automatically implement
TryFrom
inFromRepr
. This is technically a breaking change, but the fix is to just remove the manual implementation of TryFrom so it shouldn't be more than a minor inconvenience.
-
#212. Fix some clippy lints
-
#209. Use
core
instead ofstd
in a few places. -
#206. Add
get_documentation()
toEnumMessage
. This provides the ability to get the doc comment for a variant. Currently, very little formatting is done. That is subject to change. Please do not abuse this feature. Rust docs are meant for developer documentation, not long messages for users. However, this may be useful in some situations so we've added support for it. -
#202. Add a missing doc comment
-
#201. Upgrade Heck version
-
#193 Fixes an ambiguity introduced by #186 when your enum has a variant called Error.
-
#192 The work done in #189 was lost in other PR's. This re-added the functionality to support no-std.
-
#185 Adds the
FromRepr
derive that adds afrom_repr(x: usize) -> Option<Self>
method to your enum. This lets you convert integer values to your enum. If you specify a #[repr(..)] attribute on your enum, or use an explicit discriminant, this will be incorporated into the derive.from_repr
will beconst
if you use a recent rust version.- This cannot be a trait method currently because only inherent methods support
const
.
-
#186 Automatically implement
TryFrom<str>
for enums that implementEnumString
. This is only enabled for rustc >= 1.34 which is when `TryFrom was stabilized.- This is a small breaking change. If you had manually implemented
TryFrom<str>
for your enum, this will cause a conflict. You can probably remove your manual implementation.
- This is a small breaking change. If you had manually implemented
-
#189 Use
core::result::Result
instead ofstd::result::Result
. This should be more portable in no-std environments.
-
#180: Deprecates
ToString
derive. You should useDisplay
instead. -
#178: Deprecates AsStaticStr. This has been undocumented for a while. The recommended method is to derive
IntoStaticStr
instead. -
#171: Improve
no-std
support. -
#170: enable changing the path to strum traits. This is necessary if you re-export strum as a submodule in another crate.
- #164 Improve compatibility with older versions of
syn
.
-
Replace
std::
withcore::
to support no-std projects. #145 -
Breaking Changes
- MSRV is updated to 1.32 because
heck
does not work in1.31.1
anymore. Rust 1.32 came out Jan 2019 so hopefully teams have moved to an equal or newer version. - #149 Remove the "rename" feature. In Rust 2018, macros should be
imported using a qualified path to avoid collisions.
strum_macros::EnumString
rather than using the "Rename" feature to avoid collisions. - #160 enum messages: Make the returned values all 'static
- It is unlikely this will break anyone, but the new signature for functions generated by EnumMessage
is
fn get_message(&self) -> Option<&'static str>
.
- It is unlikely this will break anyone, but the new signature for functions generated by EnumMessage
is
- MSRV is updated to 1.32 because
-
Added support for ascii_case_insensitive string comparisons. #157 This feature allows
FromString
impls to match strings that differ in case from the expected variant.
-
Refactors to do better error handling. Thanks @jplatte for these changes
-
Adding
vis(scope)
to EnumDiscriminants. #137- This feature works best with versions of rust >= 1.34 due to a rustc parsing error in earlier versions.
- Earlier versions can still use
vis(r#pub)
-
These changes should not be breaking, but the amount of code modified was significant.
-
FYI about #122. The macro renames feature will be removed in early 2021. This feature was only necessary in rust 2015 because macros didn't support qualified imports so macro names could collide between crates.
- Updated docs
- Properly error on malformed strum attributes. #119
- These types of inputs have historically been ignore silently. This may break code that is already incorrect.
- Move docs back to rust docs. #121
- Updated the docs a second time to improve discoverability.
- Breaking Change: EnumVariantNames now properly adjusts to the
to_string
andserialize
attributes. - There's a regression in this release that may make strum imcompatible with other plugins if those plugins use non-rust syntax in their attributes. #104
-
Fixed a regression using
nth_back
. #85 -
Added repository to Cargo.toml. #90
-
Correctly handle fill align in
Display
impls. #95 -
Breaking Change: Use Associated Constant for EnumCount instead of const fn and free constant. #99 This behavior is consistent with the other derives.
-
Breaking Change.
default
anddisabled
should now be written as markers instead of key value pairs. Here is the old way of adding these attributes to a variant.// OLD WAY enum Test { #[strum(disabled = "true", default = "true")] Variant(String) }
Here is the new way. There is less ambiguity in the new syntax.
enum Test { #[strum(disabled, default)] Variant(String) }
-
Breaking Change. Most of the strum plugins will now error more aggresively on invalid options being used. Historically, the plugins have ignore invalid options, but most of these should error now. Silent errors are a rust anti-pattern.
- Only copy across
"doc", "cfg", "allow", "deny"
attributes from main enum variants to discriminant variants. #73 - The formatting of generated serialization variants returned by
get_serializations()
from an enum that derivesEnumMessage
is now affected by theserialize_all
property on the enum. #84 - IntoEnumIterator now has the constraint
IntoEnumIterator::Iterator<Item=Self>
andSelf: Sized
. This makes it much easier to be generic overIntoEnumIterator
and enum variants must be sized. [#80]
- Breaking Change. Enum variant names now exports an associated constant
VARIANTS
in thestrum::VariantNames
trait instead of adding avariants
method directly to the enum. The fix is touse strum::VariantNames
in your module and replace occurrances ofvariants()
withVARIANTS
. - 🐛 fix - stop incrementing iterator index after we reach the end. #76
- Strum iterators now implemented DoubleEndedIterator. #60
- Added serialize UPPERCASE
- Added "case-styles" to match the formatting convention they imply such as
kebab-case
andcamelCase
. - Added Enum Variant Names to improve compatibility with
structopt
andclap
. #56 - Added derive re-export to
strum
to allow re-exporting macros from main crate. #57 - Bumped syn and quote to
1.0
. This raises minimal compatible rust version to1.31
. - Did internal refactoring to improve organization of code. Shouldn't change user-facing api though.
- Added license file to subdirectories so they are included in crate distros.
- Added Feature flags to rename macros. This is to improve compatibility with older versions of rust. Wiki
- Allow Missing Docs on EnumCount. PR #43
- Fix serialize_all in
AsRefStr
,AsStaticStr
andIntoStaticStr
. PR #42- This is a bug fix, but it may break code that was relying on the incorrect behavior.
- Added a derive to implement
From<YourEnum>
for&'static str
. This deprecatesAsStaticStr
since the new solution doesn't require astrum
specific trait to use.
- Serialization case can be controlled using
#[strum(serialize_all = "snake_case")]
. (#21) #[derive(EnumDiscriminants)]
generates enum with variants without fields. (#33)
- Implemented
Clone
forEnumIter
s. (#18) - Added
AsStaticRef
derive to allow enums toimpl AsStaticRef<str>
. (#23)
#[allow(missing_docs)]
on generatedEnumIter
s. (#19)