1
+ function GetUnits ($unitClass )
2
+ {
3
+ $units = @ ();
4
+
5
+ foreach ($unit in $unitClass.Units )
6
+ {
7
+ $units += $unit ;
8
+ $prefixIndex = 0 ;
9
+ foreach ($prefix in $unit.Prefixes )
10
+ {
11
+ $prefixInfo = switch ($prefix )
12
+ {
13
+ " Kilo" { " k" , " 1e3" ; break ; }
14
+ " Hecto" { " h" , " 1e2" ; break ; }
15
+ " Deca" { " da" , " 1e1" ; break ; }
16
+ " Deci" { " d" , " 1e-1" ; break ; }
17
+ " Centi" { " c" , " 1e-2" ; break ; }
18
+ " Milli" { " m" , " 1e-3" ; break ; }
19
+ " Micro" { " μ" , " 1e-6" ; break ; }
20
+ " Nano" { " n" , " 1e-9" ; break ; }
21
+
22
+ # Optimization, move less frequently used prefixes to the end
23
+ " Pico" { " p" , " 1e-12" ; break ; }
24
+ " Femto" { " f" , " 1e-15" ; break ; }
25
+ " Atto" { " a" , " 1e-18" ; break ; }
26
+ " Zepto" { " z" , " 1e-21" ; break ; }
27
+ " Yocto" { " y" , " 1e-24" ; break ; }
28
+
29
+ " Yotta" { " Y" , " 1e24" ; break ; }
30
+ " Zetta" { " Z" , " 1e21" ; break ; }
31
+ " Exa" { " E" , " 1e18" ; break ; }
32
+ " Peta" { " P" , " 1e15" ; break ; }
33
+ " Tera" { " T" , " 1e12" ; break ; }
34
+ " Giga" { " G" , " 1e9" ; break ; }
35
+ " Mega" { " M" , " 1e6" ; break ; }
36
+
37
+ }
38
+
39
+ $prefixAbbreviation = $prefixInfo [0 ];
40
+ $prefixFactor = $prefixInfo [1 ];
41
+
42
+ $u = New-Object PsObject - Property @ {
43
+ SingularName = $prefix + $unit.SingularName.ToLowerInvariant ();
44
+ PluralName = $prefix + $unit.PluralName.ToLowerInvariant ();
45
+ FromUnitToBaseFunc = " (" + $unit.FromUnitToBaseFunc + " ) * $prefixFactor " ;
46
+ FromBaseToUnitFunc = " (" + $unit.FromBaseToUnitFunc + " ) / $prefixFactor " ;
47
+ Localization = $unit.Localization | % {
48
+ $abbrev = $prefixAbbreviation + $_.Abbreviations [0 ];
49
+ if ($_.AbbreviationsWithPrefixes ) {
50
+ $abbrev = $_.AbbreviationsWithPrefixes [$prefixIndex ++ ];
51
+ }
52
+
53
+ New-Object PsObject - Property @ {
54
+ Culture = $_.Culture ;
55
+ Abbreviations = $abbrev ;
56
+ }};
57
+ }
58
+
59
+ $units += $u ;
60
+ }
61
+ }
62
+
63
+ return $units | sort SingularName;
64
+ }
65
+
66
+ function GenerateUnitClass ($unitClass )
67
+ {
68
+ Write-Host " Generate unit for: " + $unitClass.Name ;
69
+
70
+ $outFileName = " $PSScriptRoot /../UnitsNet/GeneratedCode/UnitClasses/$ ( $unitClass.Name ) .g.cs" ;
71
+ GenerateUnitClassSourceCode $unitClass | Out-File - Encoding " UTF8" $outFileName
72
+ }
73
+
74
+ function GenerateUnitTestClass ($unitClass )
75
+ {
76
+ Write-Host " Generate test for: " + $unitClass.Name ;
77
+
78
+ $outFileName = " $PSScriptRoot /../../Tests/GeneratedCode/$ ( $unitClass.Name ) TestsBase.g.cs" ;
79
+ GenerateUnitTestClassSourceCode $unitClass | Out-File - Encoding " UTF8" $outFileName
80
+ }
81
+
82
+ function GenerateUnitEnum ($unitClass )
83
+ {
84
+ Write-Host " Generate unit enum for: " + $unitClass.Name ;
85
+
86
+ $outDir = " $PSScriptRoot /../UnitsNet/GeneratedCode/Enums" ;
87
+ $outFileName = " $outDir /$ ( $unitClass.Name ) Unit.g.cs" ;
88
+
89
+ New-Item - ItemType Directory - Force - Path $outDir ; # Make sure directory exists
90
+
91
+ $result = GenerateUnitEnumSourceCode $unitClass ;
92
+ $result | Out-File - Encoding " UTF8" $outFileName ;
93
+ }
94
+
95
+ function GenerateUnitSystemDefault ($unitClasses )
96
+ {
97
+ Write-Host " Generate UnitSystem.Default.g.cs." ;
98
+
99
+ $outDir = " $PSScriptRoot /../UnitsNet/GeneratedCode" ;
100
+ $outFileName = " $outDir /UnitSystem.Default.g.cs" ;
101
+
102
+ New-Item - ItemType Directory - Force - Path $outDir ; # Make sure directory exists
103
+
104
+ $result = GenerateUnitSystemDefaultSourceCode $unitClasses ;
105
+ $result | Out-File - Encoding " UTF8" $outFileName ;
106
+ }
107
+
108
+
109
+
110
+ # Load external generator functions with same name as file
111
+ . " $PSScriptRoot /Include-GenerateUnitSystemDefaultSourceCode.ps1"
112
+ . " $PSScriptRoot /Include-GenerateUnitClassSourceCode.ps1"
113
+ . " $PSScriptRoot /Include-GenerateUnitEnumSourceCode.ps1"
114
+ . " $PSScriptRoot /Include-GenerateUnitTestClassSourceCode.ps1"
115
+
116
+ $templatesDir = " $PSScriptRoot /UnitDefinitions" ;
117
+ $unitClasses = @ ();
118
+
119
+ get-childitem - path $templatesDir - filter " *.json" | % {
120
+ $templateFile = $_.FullName
121
+ $json = (Get-Content $templateFile | Out-String )
122
+ $unitClass = $json | ConvertFrom-Json
123
+
124
+ # Expand unit prefixes into units
125
+ $unitClass.Units = GetUnits $unitClass ;
126
+
127
+ GenerateUnitClass $unitClass
128
+ GenerateUnitEnum $unitClass
129
+ GenerateUnitTestClass $unitClass
130
+
131
+ $unitClasses += $unitClass ;
132
+ }
133
+
134
+ GenerateUnitSystemDefault $unitClasses
0 commit comments