timediff/locale/
de_de.rs

1use humantime::{self, DurationError};
2
3pub fn format_duration(
4    before_current_ts: bool,
5    duration_str: &String,
6) -> Result<String, DurationError> {
7    if before_current_ts {
8        match humantime::parse_duration(duration_str) {
9            Ok(v) => match v.as_secs() {
10                x if x <= 44 => {
11                    return Ok("vor ein paar Sekunden".to_string());
12                }
13                x if x <= 89 => {
14                    return Ok("vor einer Minute".to_string());
15                }
16                x if x <= 44 * 60 => {
17                    let m = x as f32 / 60_f32;
18                    return Ok(format!("vor {:.0} Minuten", m.ceil()));
19                }
20                x if x <= 89 * 60 => {
21                    return Ok("vor einer Stunde".to_string());
22                }
23                x if x <= 21 * 60 * 60 => {
24                    let h = x as f32 / 60_f32 / 60_f32;
25                    return Ok(format!("vor {:.0} Stunden", h.ceil()));
26                }
27                x if x <= 35 * 60 * 60 => {
28                    return Ok("vor einem Tag".to_string());
29                }
30                x if x <= 25 * 24 * 60 * 60 => {
31                    let d = x as f32 / 24_f32 / 60_f32 / 60_f32;
32                    return Ok(format!("vor {:.0} Tagen", d.ceil()));
33                }
34                x if x <= 45 * 24 * 60 * 60 => {
35                    return Ok("vor einem Monat".to_string());
36                }
37                x if x <= 10 * 30 * 24 * 60 * 60 => {
38                    let m = x as f32 / 30_f32 / 24_f32 / 60_f32 / 60_f32;
39                    return Ok(format!("vor {:.0} Monaten", m));
40                }
41                x if x <= 17 * 30 * 24 * 60 * 60 => {
42                    return Ok("vor einem Jahr".to_string());
43                }
44                _ => {
45                    let y = v.as_secs_f32() / 12_f32 / 30_f32 / 24_f32 / 60_f32 / 60_f32;
46                    return Ok(format!("vor {:.0} Jahren", y));
47                }
48            },
49            Err(e) => return Err(e),
50        }
51    }
52    match humantime::parse_duration(duration_str) {
53        Ok(v) => match v.as_secs() {
54            x if x <= 44 => Ok("in ein paar Sekunden".to_string()),
55            x if x <= 89 => Ok("in einer Minute".to_string()),
56            x if x <= 44 * 60 => {
57                let m = x as f32 / 60_f32;
58                return Ok(format!("in {:.0} Minuten", m.ceil()));
59            }
60            x if x <= 89 * 60 => Ok("in einer Stunde".to_string()),
61            x if x <= 21 * 60 * 60 => {
62                let h = x as f32 / 60_f32 / 60_f32;
63                return Ok(format!("in {:.0} Stunden", h.ceil()));
64            }
65            x if x <= 35 * 60 * 60 => Ok("in einem Tag".to_string()),
66            x if x <= 25 * 24 * 60 * 60 => {
67                let d = x as f32 / 24_f32 / 60_f32 / 60_f32;
68                return Ok(format!("in {:.0} Tagen", d.ceil()));
69            }
70            x if x <= 45 * 24 * 60 * 60 => Ok("in einem Monat".to_string()),
71            x if x <= 10 * 30 * 24 * 60 * 60 => {
72                let m = x as f32 / 30_f32 / 24_f32 / 60_f32 / 60_f32;
73                return Ok(format!("in {:.0} Monaten", m));
74            }
75            x if x <= 17 * 30 * 24 * 60 * 60 => Ok("in einem Jahr".to_string()),
76            _ => {
77                let y = v.as_secs_f32() / 12_f32 / 30_f32 / 24_f32 / 60_f32 / 60_f32;
78                return Ok(format!("in {:.0} Jahren", y));
79            }
80        },
81        Err(e) => Err(e),
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use crate::TimeDiff;
88
89    #[test]
90    #[allow(clippy::cognitive_complexity)]
91    fn test_units() {
92        assert_eq!(
93            TimeDiff::to_diff(String::from("-10s"))
94                .locale(String::from("de-DE"))
95                .unwrap()
96                .parse(),
97            Ok(String::from("vor ein paar Sekunden"))
98        );
99        assert_eq!(
100            TimeDiff::to_diff(String::from("-44s"))
101                .locale(String::from("de-DE"))
102                .unwrap()
103                .parse(),
104            Ok(String::from("vor ein paar Sekunden"))
105        );
106        assert_eq!(
107            TimeDiff::to_diff(String::from("-45s"))
108                .locale(String::from("de-DE"))
109                .unwrap()
110                .parse(),
111            Ok(String::from("vor einer Minute"))
112        );
113        assert_eq!(
114            TimeDiff::to_diff(String::from("-89s"))
115                .locale(String::from("de-DE"))
116                .unwrap()
117                .parse(),
118            Ok(String::from("vor einer Minute"))
119        );
120        assert_eq!(
121            TimeDiff::to_diff(String::from("-90s"))
122                .locale(String::from("de-DE"))
123                .unwrap()
124                .parse(),
125            Ok(String::from("vor 2 Minuten"))
126        );
127        assert_eq!(
128            TimeDiff::to_diff(String::from("-91s"))
129                .locale(String::from("de-DE"))
130                .unwrap()
131                .parse(),
132            Ok(String::from("vor 2 Minuten"))
133        );
134        assert_eq!(
135            TimeDiff::to_diff(String::from("-2m"))
136                .locale(String::from("de-DE"))
137                .unwrap()
138                .parse(),
139            Ok(String::from("vor 2 Minuten"))
140        );
141        assert_eq!(
142            TimeDiff::to_diff(String::from("-10m"))
143                .locale(String::from("de-DE"))
144                .unwrap()
145                .parse(),
146            Ok(String::from("vor 10 Minuten"))
147        );
148        assert_eq!(
149            TimeDiff::to_diff(String::from("-44m"))
150                .locale(String::from("de-DE"))
151                .unwrap()
152                .parse(),
153            Ok(String::from("vor 44 Minuten"))
154        );
155        assert_eq!(
156            TimeDiff::to_diff(String::from("-45m"))
157                .locale(String::from("de-DE"))
158                .unwrap()
159                .parse(),
160            Ok(String::from("vor einer Stunde"))
161        );
162        assert_eq!(
163            TimeDiff::to_diff(String::from("-60m"))
164                .locale(String::from("de-DE"))
165                .unwrap()
166                .parse(),
167            Ok(String::from("vor einer Stunde"))
168        );
169        assert_eq!(
170            TimeDiff::to_diff(String::from("-1h"))
171                .locale(String::from("de-DE"))
172                .unwrap()
173                .parse(),
174            Ok(String::from("vor einer Stunde"))
175        );
176        assert_eq!(
177            TimeDiff::to_diff(String::from("-80m"))
178                .locale(String::from("de-DE"))
179                .unwrap()
180                .parse(),
181            Ok(String::from("vor einer Stunde"))
182        );
183        assert_eq!(
184            TimeDiff::to_diff(String::from("-89m"))
185                .locale(String::from("de-DE"))
186                .unwrap()
187                .parse(),
188            Ok(String::from("vor einer Stunde"))
189        );
190        assert_eq!(
191            TimeDiff::to_diff(String::from("-90m"))
192                .locale(String::from("de-DE"))
193                .unwrap()
194                .parse(),
195            Ok(String::from("vor 2 Stunden"))
196        );
197        assert_eq!(
198            TimeDiff::to_diff(String::from("-2h"))
199                .locale(String::from("de-DE"))
200                .unwrap()
201                .parse(),
202            Ok(String::from("vor 2 Stunden"))
203        );
204        assert_eq!(
205            TimeDiff::to_diff(String::from("-20h"))
206                .locale(String::from("de-DE"))
207                .unwrap()
208                .parse(),
209            Ok(String::from("vor 20 Stunden"))
210        );
211        assert_eq!(
212            TimeDiff::to_diff(String::from("-21h"))
213                .locale(String::from("de-DE"))
214                .unwrap()
215                .parse(),
216            Ok(String::from("vor 21 Stunden"))
217        );
218        assert_eq!(
219            TimeDiff::to_diff(String::from("-21h30m"))
220                .locale(String::from("de-DE"))
221                .unwrap()
222                .parse(),
223            Ok(String::from("vor einem Tag"))
224        );
225        assert_eq!(
226            TimeDiff::to_diff(String::from("-22h"))
227                .locale(String::from("de-DE"))
228                .unwrap()
229                .parse(),
230            Ok(String::from("vor einem Tag"))
231        );
232        assert_eq!(
233            TimeDiff::to_diff(String::from("-24h"))
234                .locale(String::from("de-DE"))
235                .unwrap()
236                .parse(),
237            Ok(String::from("vor einem Tag"))
238        );
239        assert_eq!(
240            TimeDiff::to_diff(String::from("-24h30m"))
241                .locale(String::from("de-DE"))
242                .unwrap()
243                .parse(),
244            Ok(String::from("vor einem Tag"))
245        );
246        assert_eq!(
247            TimeDiff::to_diff(String::from("-34h59m"))
248                .locale(String::from("de-DE"))
249                .unwrap()
250                .parse(),
251            Ok(String::from("vor einem Tag"))
252        );
253        assert_eq!(
254            TimeDiff::to_diff(String::from("-36h"))
255                .locale(String::from("de-DE"))
256                .unwrap()
257                .parse(),
258            Ok(String::from("vor 2 Tagen"))
259        );
260        assert_eq!(
261            TimeDiff::to_diff(String::from("-10d"))
262                .locale(String::from("de-DE"))
263                .unwrap()
264                .parse(),
265            Ok(String::from("vor 10 Tagen"))
266        );
267        assert_eq!(
268            TimeDiff::to_diff(String::from("-25d"))
269                .locale(String::from("de-DE"))
270                .unwrap()
271                .parse(),
272            Ok(String::from("vor 25 Tagen"))
273        );
274        assert_eq!(
275            TimeDiff::to_diff(String::from("-26d"))
276                .locale(String::from("de-DE"))
277                .unwrap()
278                .parse(),
279            Ok(String::from("vor einem Monat"))
280        );
281        assert_eq!(
282            TimeDiff::to_diff(String::from("-45d"))
283                .locale(String::from("de-DE"))
284                .unwrap()
285                .parse(),
286            Ok(String::from("vor einem Monat"))
287        );
288        assert_eq!(
289            TimeDiff::to_diff(String::from("-45d2m"))
290                .locale(String::from("de-DE"))
291                .unwrap()
292                .parse(),
293            Ok(String::from("vor 2 Monaten"))
294        );
295        assert_eq!(
296            TimeDiff::to_diff(String::from("-46d"))
297                .locale(String::from("de-DE"))
298                .unwrap()
299                .parse(),
300            Ok(String::from("vor 2 Monaten"))
301        );
302        assert_eq!(
303            TimeDiff::to_diff(String::from("-80d"))
304                .locale(String::from("de-DE"))
305                .unwrap()
306                .parse(),
307            Ok(String::from("vor 3 Monaten"))
308        );
309        assert_eq!(
310            TimeDiff::to_diff(String::from("-9M"))
311                .locale(String::from("de-DE"))
312                .unwrap()
313                .parse(),
314            Ok(String::from("vor 9 Monaten"))
315        );
316        assert_eq!(
317            TimeDiff::to_diff(String::from("-10M"))
318                .locale(String::from("de-DE"))
319                .unwrap()
320                .parse(),
321            Ok(String::from("vor einem Jahr"))
322        );
323        assert_eq!(
324            TimeDiff::to_diff(String::from("-10M1m"))
325                .locale(String::from("de-DE"))
326                .unwrap()
327                .parse(),
328            Ok(String::from("vor einem Jahr"))
329        );
330        assert_eq!(
331            TimeDiff::to_diff(String::from("-12M"))
332                .locale(String::from("de-DE"))
333                .unwrap()
334                .parse(),
335            Ok(String::from("vor einem Jahr"))
336        );
337        assert_eq!(
338            TimeDiff::to_diff(String::from("-17M"))
339                .locale(String::from("de-DE"))
340                .unwrap()
341                .parse(),
342            Ok(String::from("vor 1 Jahren"))
343        );
344        assert_eq!(
345            TimeDiff::to_diff(String::from("-24M"))
346                .locale(String::from("de-DE"))
347                .unwrap()
348                .parse(),
349            Ok(String::from("vor 2 Jahren"))
350        );
351        assert_eq!(
352            TimeDiff::to_diff(String::from("-20y"))
353                .locale(String::from("de-DE"))
354                .unwrap()
355                .parse(),
356            Ok(String::from("vor 20 Jahren"))
357        );
358        assert_eq!(
359            TimeDiff::to_diff(String::from("-100y"))
360                .locale(String::from("de-DE"))
361                .unwrap()
362                .parse(),
363            Ok(String::from("vor 101 Jahren"))
364        );
365
366        assert_eq!(
367            TimeDiff::to_diff(String::from("10s"))
368                .locale(String::from("de-DE"))
369                .unwrap()
370                .parse(),
371            Ok(String::from("in ein paar Sekunden"))
372        );
373        assert_eq!(
374            TimeDiff::to_diff(String::from("44s"))
375                .locale(String::from("de-DE"))
376                .unwrap()
377                .parse(),
378            Ok(String::from("in ein paar Sekunden"))
379        );
380        assert_eq!(
381            TimeDiff::to_diff(String::from("45s"))
382                .locale(String::from("de-DE"))
383                .unwrap()
384                .parse(),
385            Ok(String::from("in einer Minute"))
386        );
387        assert_eq!(
388            TimeDiff::to_diff(String::from("89s"))
389                .locale(String::from("de-DE"))
390                .unwrap()
391                .parse(),
392            Ok(String::from("in einer Minute"))
393        );
394        assert_eq!(
395            TimeDiff::to_diff(String::from("90s"))
396                .locale(String::from("de-DE"))
397                .unwrap()
398                .parse(),
399            Ok(String::from("in 2 Minuten"))
400        );
401        assert_eq!(
402            TimeDiff::to_diff(String::from("2m"))
403                .locale(String::from("de-DE"))
404                .unwrap()
405                .parse(),
406            Ok(String::from("in 2 Minuten"))
407        );
408        assert_eq!(
409            TimeDiff::to_diff(String::from("10m"))
410                .locale(String::from("de-DE"))
411                .unwrap()
412                .parse(),
413            Ok(String::from("in 10 Minuten"))
414        );
415        assert_eq!(
416            TimeDiff::to_diff(String::from("44m"))
417                .locale(String::from("de-DE"))
418                .unwrap()
419                .parse(),
420            Ok(String::from("in 44 Minuten"))
421        );
422        assert_eq!(
423            TimeDiff::to_diff(String::from("45m"))
424                .locale(String::from("de-DE"))
425                .unwrap()
426                .parse(),
427            Ok(String::from("in einer Stunde"))
428        );
429        assert_eq!(
430            TimeDiff::to_diff(String::from("60m"))
431                .locale(String::from("de-DE"))
432                .unwrap()
433                .parse(),
434            Ok(String::from("in einer Stunde"))
435        );
436        assert_eq!(
437            TimeDiff::to_diff(String::from("1h"))
438                .locale(String::from("de-DE"))
439                .unwrap()
440                .parse(),
441            Ok(String::from("in einer Stunde"))
442        );
443        assert_eq!(
444            TimeDiff::to_diff(String::from("80m"))
445                .locale(String::from("de-DE"))
446                .unwrap()
447                .parse(),
448            Ok(String::from("in einer Stunde"))
449        );
450        assert_eq!(
451            TimeDiff::to_diff(String::from("89m"))
452                .locale(String::from("de-DE"))
453                .unwrap()
454                .parse(),
455            Ok(String::from("in einer Stunde"))
456        );
457        assert_eq!(
458            TimeDiff::to_diff(String::from("89m10s"))
459                .locale(String::from("de-DE"))
460                .unwrap()
461                .parse(),
462            Ok(String::from("in 2 Stunden"))
463        );
464        assert_eq!(
465            TimeDiff::to_diff(String::from("90m"))
466                .locale(String::from("de-DE"))
467                .unwrap()
468                .parse(),
469            Ok(String::from("in 2 Stunden"))
470        );
471        assert_eq!(
472            TimeDiff::to_diff(String::from("2h"))
473                .locale(String::from("de-DE"))
474                .unwrap()
475                .parse(),
476            Ok(String::from("in 2 Stunden"))
477        );
478        assert_eq!(
479            TimeDiff::to_diff(String::from("20h"))
480                .locale(String::from("de-DE"))
481                .unwrap()
482                .parse(),
483            Ok(String::from("in 20 Stunden"))
484        );
485        assert_eq!(
486            TimeDiff::to_diff(String::from("21h"))
487                .locale(String::from("de-DE"))
488                .unwrap()
489                .parse(),
490            Ok(String::from("in 21 Stunden"))
491        );
492        assert_eq!(
493            TimeDiff::to_diff(String::from("21h30m"))
494                .locale(String::from("de-DE"))
495                .unwrap()
496                .parse(),
497            Ok(String::from("in einem Tag"))
498        );
499        assert_eq!(
500            TimeDiff::to_diff(String::from("22h"))
501                .locale(String::from("de-DE"))
502                .unwrap()
503                .parse(),
504            Ok(String::from("in einem Tag"))
505        );
506        assert_eq!(
507            TimeDiff::to_diff(String::from("24h"))
508                .locale(String::from("de-DE"))
509                .unwrap()
510                .parse(),
511            Ok(String::from("in einem Tag"))
512        );
513        assert_eq!(
514            TimeDiff::to_diff(String::from("35h10m"))
515                .locale(String::from("de-DE"))
516                .unwrap()
517                .parse(),
518            Ok(String::from("in 2 Tagen"))
519        );
520        assert_eq!(
521            TimeDiff::to_diff(String::from("36h"))
522                .locale(String::from("de-DE"))
523                .unwrap()
524                .parse(),
525            Ok(String::from("in 2 Tagen"))
526        );
527        assert_eq!(
528            TimeDiff::to_diff(String::from("10d"))
529                .locale(String::from("de-DE"))
530                .unwrap()
531                .parse(),
532            Ok(String::from("in 10 Tagen"))
533        );
534        assert_eq!(
535            TimeDiff::to_diff(String::from("25d"))
536                .locale(String::from("de-DE"))
537                .unwrap()
538                .parse(),
539            Ok(String::from("in 25 Tagen"))
540        );
541        assert_eq!(
542            TimeDiff::to_diff(String::from("26d"))
543                .locale(String::from("de-DE"))
544                .unwrap()
545                .parse(),
546            Ok(String::from("in einem Monat"))
547        );
548        assert_eq!(
549            TimeDiff::to_diff(String::from("45d"))
550                .locale(String::from("de-DE"))
551                .unwrap()
552                .parse(),
553            Ok(String::from("in einem Monat"))
554        );
555        assert_eq!(
556            TimeDiff::to_diff(String::from("45d1m"))
557                .locale(String::from("de-DE"))
558                .unwrap()
559                .parse(),
560            Ok(String::from("in 2 Monaten"))
561        );
562        assert_eq!(
563            TimeDiff::to_diff(String::from("46d"))
564                .locale(String::from("de-DE"))
565                .unwrap()
566                .parse(),
567            Ok(String::from("in 2 Monaten"))
568        );
569        assert_eq!(
570            TimeDiff::to_diff(String::from("80d"))
571                .locale(String::from("de-DE"))
572                .unwrap()
573                .parse(),
574            Ok(String::from("in 3 Monaten"))
575        );
576        assert_eq!(
577            TimeDiff::to_diff(String::from("9M"))
578                .locale(String::from("de-DE"))
579                .unwrap()
580                .parse(),
581            Ok(String::from("in 9 Monaten"))
582        );
583        assert_eq!(
584            TimeDiff::to_diff(String::from("10M"))
585                .locale(String::from("de-DE"))
586                .unwrap()
587                .parse(),
588            Ok(String::from("in einem Jahr"))
589        );
590        assert_eq!(
591            TimeDiff::to_diff(String::from("10M1m"))
592                .locale(String::from("de-DE"))
593                .unwrap()
594                .parse(),
595            Ok(String::from("in einem Jahr"))
596        );
597        assert_eq!(
598            TimeDiff::to_diff(String::from("12M"))
599                .locale(String::from("de-DE"))
600                .unwrap()
601                .parse(),
602            Ok(String::from("in einem Jahr"))
603        );
604        assert_eq!(
605            TimeDiff::to_diff(String::from("24M"))
606                .locale(String::from("de-DE"))
607                .unwrap()
608                .parse(),
609            Ok(String::from("in 2 Jahren"))
610        );
611        assert_eq!(
612            TimeDiff::to_diff(String::from("20y"))
613                .locale(String::from("de-DE"))
614                .unwrap()
615                .parse(),
616            Ok(String::from("in 20 Jahren"))
617        );
618        assert_eq!(
619            TimeDiff::to_diff(String::from("100y"))
620                .locale(String::from("de-DE"))
621                .unwrap()
622                .parse(),
623            Ok(String::from("in 101 Jahren"))
624        );
625    }
626}