@@ -19,73 +19,100 @@ version (DeimosOpenSSL_1_0_0)
19
19
{
20
20
// https://www.openssl.org/news/changelog.html#openssl-100
21
21
// OpenSSL 1.0.0t was released 2015-12-03
22
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.0.0t" ;
22
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.0.0t" ) ;
23
23
}
24
24
else version (DeimosOpenSSL_1_0_1)
25
25
{
26
26
// https://www.openssl.org/news/changelog.html#openssl-101
27
27
// OpenSSL 1.0.1u was released 2016-09-22
28
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.0.1u" ;
28
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.0.1u" ) ;
29
29
}
30
30
else version (DeimosOpenSSL_1_0_2)
31
31
{
32
32
// https://www.openssl.org/news/changelog.html#openssl-102
33
33
// OpenSSL 1.0.2t was released 2019-09-10
34
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.0.2t" ;
34
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.0.2t" ) ;
35
35
}
36
36
else version (DeimosOpenSSL_1_1_0)
37
37
{
38
38
// https://www.openssl.org/news/changelog.html#openssl-110
39
39
// OpenSSL 1.1.0l was released 2019-09-10
40
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.1.0l" ;
40
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.1.0l" ) ;
41
41
}
42
42
else version (DeimosOpenSSL_1_1_1)
43
43
{
44
44
// https://www.openssl.org/news/changelog.html#openssl-111
45
45
// OpenSSL 1.1.1m was released 2021-12-14
46
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.1.1m" ;
46
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.1.1m" ) ;
47
47
}
48
48
else version (DeimosOpenSSL_3_0)
49
49
{
50
50
// https://www.openssl.org/news/changelog.html#openssl-30
51
51
// OpenSSL 3.0.3 was released 2022-05-03
52
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 3.0.3" ;
52
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 3.0.3" ) ;
53
53
}
54
54
else version (DeimosOpenSSLAutoDetect)
55
55
{
56
56
import deimos.openssl.version_;
57
57
58
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! OpenSSLTextVersion;
58
+ public enum OpenSSLVersion = parseOpenSSLVersion( OpenSSLTextVersion) ;
59
59
}
60
60
else
61
61
{
62
62
// It was decided in https://github.com/D-Programming-Deimos/openssl/pull/66
63
63
// that we should fall back to the latest supported version of the bindings,
64
64
// should the user provide neither explicit version nor `DeimosOpenSSLAutoDetect`
65
- public alias OpenSSLVersion = OpenSSLVersionTemplate ! " 1.1.0h" ;
65
+ public enum OpenSSLVersion = parseOpenSSLVersion( " 1.1.0h" ) ;
66
66
}
67
67
68
68
// Publicly aliased above
69
- private struct OpenSSLVersionTemplate ( string textVersion)
69
+ private struct OpenSSLVersionStruct
70
70
{
71
- enum text = textVersion;
71
+ string text;
72
+ uint major, minor, patch;
73
+ int build;
74
+ }
75
+
76
+ private OpenSSLVersionStruct parseOpenSSLVersion ()(string textVersion)
77
+ {
78
+ OpenSSLVersionStruct v;
79
+
80
+ import std.ascii : isDigit;
81
+ import std.algorithm.iteration : splitter;
82
+ import std.algorithm.searching : canFind;
83
+ import std.conv : to;
84
+ import std.range : dropExactly;
72
85
73
- enum int major = (text[0 ] - ' 0' );
74
- static assert (major >= 0 );
86
+ v.text = textVersion;
75
87
76
- enum int minor = (text[2 ] - ' 0' );
77
- static assert (minor >= 0 );
88
+ v.major = textVersion.splitter(' .' )
89
+ .front.to! uint ;
90
+ assert (v.major >= 0 );
78
91
79
- enum int patch = (text[4 ] - ' 0' );
80
- static assert (patch >= 0 );
92
+ v.minor = textVersion.splitter(' .' )
93
+ .dropExactly(1 )
94
+ .front.to! uint ;
95
+ assert (v.minor >= 0 );
81
96
82
- static if (text.length == " 1.1.0h" .length)
97
+ // `std.algorithm.iteration : splitWhen` not usable at CT
98
+ // so we're using `canFind`.
99
+ string patchText = textVersion.splitter(' .' )
100
+ .dropExactly(2 ).front;
101
+ auto patchChar = patchText.canFind! (
102
+ (dchar c) => ! c.isDigit());
103
+
104
+ v.patch = patchText[0 .. $ - patchChar].to! uint ;
105
+ assert (v.patch >= 0 );
106
+
107
+ if (patchChar)
83
108
{
84
- enum int build = (text[ 5 ] - ' `' );
85
- static assert (build >= 0 );
109
+ v. build = (patchText[$ - 1 ] - ' `' );
110
+ assert (v. build >= 0 );
86
111
}
87
112
else
88
- enum int build = 0 ;
113
+ v.build = 0 ;
114
+
115
+ return v;
89
116
}
90
117
91
118
/* Numeric release version identifier:
0 commit comments