@@ -37,6 +37,7 @@ std::string minimum(std::string_view range) { return ""; }
3737std::expected<std::string, parse_error> inc (version input,
3838 release_type release_type) {
3939 version_weaver::version result;
40+ std::string incremented;
4041 switch (release_type) {
4142 case MAJOR:
4243 case PRE_MAJOR: {
@@ -48,8 +49,8 @@ std::expected<std::string, parse_error> inc(version input,
4849 return std::unexpected (parse_error::INVALID_MAJOR);
4950 }
5051 auto incremented_major_int = major_int + 1 ;
51- auto major = std::to_string (incremented_major_int);
52- result = version_weaver::version{major , " 0" , " 0" };
52+ incremented = std::to_string (incremented_major_int);
53+ result = version_weaver::version{incremented , " 0" , " 0" };
5354 break ;
5455 }
5556 case MINOR:
@@ -62,15 +63,34 @@ std::expected<std::string, parse_error> inc(version input,
6263 return std::unexpected (parse_error::INVALID_MINOR);
6364 }
6465 auto incremented_minor_int = minor_int + 1 ;
65- result = version_weaver::version{
66- input.major , std::to_string (incremented_minor_int) , " 0" };
66+ incremented = std::to_string (incremented_minor_int);
67+ result = version_weaver::version{ input.major , incremented , " 0" };
6768 break ;
6869 }
6970 case PATCH:
70- case PRE_PATCH: {
71- if (input.pre_release && release_type != PRE_PATCH) {
71+ case PRE_PATCH:
72+ case PRE_RELEASE: {
73+ if (input.pre_release .has_value () && release_type == PATCH) {
7274 return version_weaver::version{input.major , input.minor , input.patch };
7375 }
76+ if (release_type == PRE_RELEASE && input.pre_release .has_value ()) {
77+ // TODO: support non-int pre_releases as well
78+ // (see:
79+ // https://github.com/npm/node-semver/blob/d17aebf8/test/fixtures/increments.js#L22-L36)
80+ auto pre_release_value = input.pre_release .value ();
81+ int prerelease_int;
82+ auto [ptr, ec] =
83+ std::from_chars (pre_release_value.data (),
84+ pre_release_value.data () + pre_release_value.size (),
85+ prerelease_int);
86+ if (ec != std::errc ()) {
87+ return std::unexpected (parse_error::INVALID_PRERELEASE);
88+ }
89+ auto incremented_prerelease_int = prerelease_int + 1 ;
90+ incremented = std::to_string (incremented_prerelease_int);
91+ return version_weaver::version{input.major , input.minor , input.patch ,
92+ incremented};
93+ }
7494 int patch_int;
7595 auto [ptr, ec] =
7696 std::from_chars (input.patch .data (),
@@ -79,8 +99,8 @@ std::expected<std::string, parse_error> inc(version input,
7999 return std::unexpected (parse_error::INVALID_PATCH);
80100 }
81101 auto incremented_patch_int = patch_int + 1 ;
82- result = version_weaver::version{input. major , input. minor ,
83- std::to_string (incremented_patch_int) };
102+ incremented = std::to_string (incremented_patch_int);
103+ result = version_weaver::version{input. major , input. minor , incremented };
84104 break ;
85105 }
86106 case RELEASE: {
@@ -94,7 +114,7 @@ std::expected<std::string, parse_error> inc(version input,
94114 }
95115
96116 if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
97- release_type == PRE_PATCH) {
117+ release_type == PRE_PATCH || release_type == PRE_RELEASE ) {
98118 result.pre_release = " 0" ;
99119 }
100120
0 commit comments