1use crate::client::{Client, HglibError, Runner};
6use crate::{runcommand, MkArg};
7
8pub struct Arg<'a> {
9 pub rev: &'a str,
10 pub clean: bool,
11 pub check: bool,
12 pub date: &'a str,
13}
14
15impl<'a> Default for Arg<'a> {
16 fn default() -> Self {
17 Self {
18 rev: "",
19 clean: false,
20 check: false,
21 date: "",
22 }
23 }
24}
25
26impl<'a> Arg<'a> {
27 fn run(&self, client: &mut Client) -> Result<(Vec<u8>, i32), HglibError> {
28 runcommand!(
29 client,
30 "update",
31 &[""],
32 "-r",
33 self.rev,
34 "-C",
35 self.clean,
36 "-c",
37 self.check,
38 "-d",
39 self.date
40 )
41 }
42}
43
44#[derive(Debug, PartialEq)]
45pub struct Update {
46 pub updated: u32,
47 pub merged: u32,
48 pub removed: u32,
49 pub unresolved: u32,
50}
51
52impl Client {
53 pub fn update(&mut self, x: Arg) -> Result<Update, HglibError> {
54 let data = match x.run(self) {
55 Ok((data, _)) => data,
56 Err(err) => {
57 if err.code == 1 && err.out.is_some() {
58 err.out.unwrap()
59 } else {
60 return Err(err);
61 }
62 }
63 };
64
65 let iter = &mut data.iter();
66 let n = iter.find(|x| b'0' <= **x && **x <= b'9').unwrap();
67 let n = u32::from(n - b'0');
68
69 let updated = iter
70 .take_while(|x| **x != b' ')
71 .fold(n, |r, x| r * 10 + u32::from(*x - b'0'));
72 iter.find(|x| **x == b',').unwrap();
73 iter.next();
74
75 let merged = iter
76 .take_while(|x| **x != b' ')
77 .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
78 iter.find(|x| **x == b',').unwrap();
79 iter.next();
80
81 let removed = iter
82 .take_while(|x| **x != b' ')
83 .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
84 iter.find(|x| **x == b',').unwrap();
85 iter.next();
86
87 let unresolved = iter
88 .take_while(|x| **x != b' ')
89 .fold(0, |r, x| r * 10 + u32::from(*x - b'0'));
90
91 Ok(Update {
92 updated,
93 merged,
94 removed,
95 unresolved,
96 })
97 }
98}