@@ -163,33 +163,38 @@ impl Language {
163
163
fn get_languages_stat ( languages : & tokei:: Languages ) -> Option < HashMap < Language , f64 > > {
164
164
let mut stats = HashMap :: new ( ) ;
165
165
166
- let sum_language_code: usize = languages. iter ( ) . map ( |( _, v) | v. code ) . sum ( ) ;
166
+ for ( language_type, language) in languages. iter ( ) {
167
+ let mut code = language. code ;
167
168
168
- if sum_language_code == 0 {
169
- None
170
- } else {
171
- for ( language_type, language) in languages. iter ( ) {
172
- let mut code = language. code as usize ;
169
+ let has_children = !language. children . is_empty ( ) ;
173
170
174
- let has_children = !language. children . is_empty ( ) ;
175
-
176
- if has_children {
177
- for reports in language. children . values ( ) {
178
- for stats in reports. iter ( ) . map ( |r| r. stats . summarise ( ) ) {
179
- code += stats. code ;
180
- }
171
+ if has_children {
172
+ for reports in language. children . values ( ) {
173
+ for stats in reports. iter ( ) . map ( |r| r. stats . summarise ( ) ) {
174
+ code += stats. code ;
181
175
}
182
176
}
177
+ }
183
178
184
- if code == 0 {
185
- continue ;
186
- }
179
+ if code == 0 {
180
+ continue ;
181
+ }
187
182
188
- stats. insert (
189
- Language :: from ( * language_type) ,
190
- ( code as f64 / sum_language_code as f64 ) * 100.00 ,
191
- ) ;
183
+ stats. insert ( Language :: from ( * language_type) , code as f64 ) ;
184
+ }
185
+
186
+ let total: f64 = stats. iter ( ) . map ( |( _, v) | v) . sum ( ) ;
187
+
188
+ let error_margin = f64:: EPSILON ;
189
+
190
+ if ( total - 0 as f64 ) . abs ( ) < error_margin {
191
+ None
192
+ } else {
193
+ for ( _, val) in stats. iter_mut ( ) {
194
+ * val /= total;
195
+ * val *= 100_f64 ;
192
196
}
197
+
193
198
Some ( stats)
194
199
}
195
200
}
0 commit comments