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}