diff --git a/client/status.go b/client/status.go index a8417df..d56773e 100644 --- a/client/status.go +++ b/client/status.go @@ -252,7 +252,13 @@ func (t *tui) renderReplicationReport(rep *replication.Report) { return all[i].Filesystem < all[j].Filesystem }) - t.printf("Status: %s", rep.Status) + state, err := replication.StateString(rep.Status) + if err != nil { + t.printf("Status: %q (parse error: %q)\n", rep.Status, err) + return + } + + t.printf("Status: %s", state) t.newline() if rep.Problem != "" { t.printf("Problem: %s", rep.Problem) @@ -261,8 +267,8 @@ func (t *tui) renderReplicationReport(rep *replication.Report) { if rep.SleepUntil.After(time.Now()) { t.printf("Sleeping until %s (%s left)\n", rep.SleepUntil, rep.SleepUntil.Sub(time.Now())) } - if rep.Status != replication.Planning.String() && - rep.Status != replication.PlanningError.String() { + + if state != replication.Planning && state != replication.PlanningError { // Progress: [---------------] sumUpFSRep := func(rep *fsrep.Report) (transferred, total int64) { for _, s := range rep.Pending { @@ -304,7 +310,13 @@ func (t *tui) renderPrunerReport(r *pruner.Report) { return } - t.printf("Status: %s", r.State) + state, err := pruner.StateString(r.State) + if err != nil { + t.printf("Status: %q (parse error: %q)\n", r.State, err) + return + } + + t.printf("Status: %s", state) t.newline() if r.Error != "" { diff --git a/daemon/pruner/pruner.go b/daemon/pruner/pruner.go index c2f3382..cddd687 100644 --- a/daemon/pruner/pruner.go +++ b/daemon/pruner/pruner.go @@ -151,7 +151,7 @@ func (f *PrunerFactory) BuildReceiverPruner(ctx context.Context, target Target, return p } -//go:generate stringer -type=State +//go:generate enumer -type=State type State int const ( diff --git a/daemon/pruner/state_enumer.go b/daemon/pruner/state_enumer.go new file mode 100644 index 0000000..8c396ab --- /dev/null +++ b/daemon/pruner/state_enumer.go @@ -0,0 +1,76 @@ +// Code generated by "enumer -type=State"; DO NOT EDIT. + +package pruner + +import ( + "fmt" +) + +const ( + _StateName_0 = "PlanPlanWait" + _StateName_1 = "Exec" + _StateName_2 = "ExecWait" + _StateName_3 = "ErrPerm" + _StateName_4 = "Done" +) + +var ( + _StateIndex_0 = [...]uint8{0, 4, 12} + _StateIndex_1 = [...]uint8{0, 4} + _StateIndex_2 = [...]uint8{0, 8} + _StateIndex_3 = [...]uint8{0, 7} + _StateIndex_4 = [...]uint8{0, 4} +) + +func (i State) String() string { + switch { + case 1 <= i && i <= 2: + i -= 1 + return _StateName_0[_StateIndex_0[i]:_StateIndex_0[i+1]] + case i == 4: + return _StateName_1 + case i == 8: + return _StateName_2 + case i == 16: + return _StateName_3 + case i == 32: + return _StateName_4 + default: + return fmt.Sprintf("State(%d)", i) + } +} + +var _StateValues = []State{1, 2, 4, 8, 16, 32} + +var _StateNameToValueMap = map[string]State{ + _StateName_0[0:4]: 1, + _StateName_0[4:12]: 2, + _StateName_1[0:4]: 4, + _StateName_2[0:8]: 8, + _StateName_3[0:7]: 16, + _StateName_4[0:4]: 32, +} + +// StateString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func StateString(s string) (State, error) { + if val, ok := _StateNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to State values", s) +} + +// StateValues returns all values of the enum +func StateValues() []State { + return _StateValues +} + +// IsAState returns "true" if the value is listed in the enum definition. "false" otherwise +func (i State) IsAState() bool { + for _, v := range _StateValues { + if i == v { + return true + } + } + return false +} diff --git a/daemon/pruner/state_string.go b/daemon/pruner/state_string.go deleted file mode 100644 index 68e04e1..0000000 --- a/daemon/pruner/state_string.go +++ /dev/null @@ -1,35 +0,0 @@ -// Code generated by "stringer -type=State"; DO NOT EDIT. - -package pruner - -import "strconv" - -const ( - _State_name_0 = "PlanPlanWait" - _State_name_1 = "Exec" - _State_name_2 = "ExecWait" - _State_name_3 = "ErrPerm" - _State_name_4 = "Done" -) - -var ( - _State_index_0 = [...]uint8{0, 4, 12} -) - -func (i State) String() string { - switch { - case 1 <= i && i <= 2: - i -= 1 - return _State_name_0[_State_index_0[i]:_State_index_0[i+1]] - case i == 4: - return _State_name_1 - case i == 8: - return _State_name_2 - case i == 16: - return _State_name_3 - case i == 32: - return _State_name_4 - default: - return "State(" + strconv.FormatInt(int64(i), 10) + ")" - } -} diff --git a/lazy.sh b/lazy.sh index a8c7316..434f66b 100755 --- a/lazy.sh +++ b/lazy.sh @@ -30,7 +30,8 @@ builddep() { go get -u golang.org/x/tools/cmd/stringer go get -u github.com/golang/dep/cmd/dep go get -u github.com/golang/protobuf/protoc-gen-go - if ! type stringer || ! type dep || ! type protoc-gen-go; then + go get -u github.com/alvaroloes/enumer + if ! type stringer || ! type dep || ! type protoc-gen-go; || ! type enumer then echo "Installed dependencies but can't find them in \$PATH, adjust it to contain \$GOPATH/bin" 1>&2 exit 1 fi diff --git a/replication/mainfsm.go b/replication/mainfsm.go index 15137b0..086fda1 100644 --- a/replication/mainfsm.go +++ b/replication/mainfsm.go @@ -18,7 +18,7 @@ import ( "github.com/zrepl/zrepl/replication/pdu" ) -//go:generate stringer -type=State +//go:generate enumer -type=State type State uint const ( diff --git a/replication/state_enumer.go b/replication/state_enumer.go new file mode 100644 index 0000000..7343d69 --- /dev/null +++ b/replication/state_enumer.go @@ -0,0 +1,76 @@ +// Code generated by "enumer -type=State"; DO NOT EDIT. + +package replication + +import ( + "fmt" +) + +const ( + _StateName_0 = "PlanningPlanningError" + _StateName_1 = "Working" + _StateName_2 = "WorkingWait" + _StateName_3 = "Completed" + _StateName_4 = "ContextDone" +) + +var ( + _StateIndex_0 = [...]uint8{0, 8, 21} + _StateIndex_1 = [...]uint8{0, 7} + _StateIndex_2 = [...]uint8{0, 11} + _StateIndex_3 = [...]uint8{0, 9} + _StateIndex_4 = [...]uint8{0, 11} +) + +func (i State) String() string { + switch { + case 1 <= i && i <= 2: + i -= 1 + return _StateName_0[_StateIndex_0[i]:_StateIndex_0[i+1]] + case i == 4: + return _StateName_1 + case i == 8: + return _StateName_2 + case i == 16: + return _StateName_3 + case i == 32: + return _StateName_4 + default: + return fmt.Sprintf("State(%d)", i) + } +} + +var _StateValues = []State{1, 2, 4, 8, 16, 32} + +var _StateNameToValueMap = map[string]State{ + _StateName_0[0:8]: 1, + _StateName_0[8:21]: 2, + _StateName_1[0:7]: 4, + _StateName_2[0:11]: 8, + _StateName_3[0:9]: 16, + _StateName_4[0:11]: 32, +} + +// StateString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func StateString(s string) (State, error) { + if val, ok := _StateNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to State values", s) +} + +// StateValues returns all values of the enum +func StateValues() []State { + return _StateValues +} + +// IsAState returns "true" if the value is listed in the enum definition. "false" otherwise +func (i State) IsAState() bool { + for _, v := range _StateValues { + if i == v { + return true + } + } + return false +} diff --git a/replication/state_string.go b/replication/state_string.go deleted file mode 100644 index a4514d2..0000000 --- a/replication/state_string.go +++ /dev/null @@ -1,35 +0,0 @@ -// Code generated by "stringer -type=State"; DO NOT EDIT. - -package replication - -import "strconv" - -const ( - _State_name_0 = "PlanningPlanningError" - _State_name_1 = "Working" - _State_name_2 = "WorkingWait" - _State_name_3 = "Completed" - _State_name_4 = "ContextDone" -) - -var ( - _State_index_0 = [...]uint8{0, 8, 21} -) - -func (i State) String() string { - switch { - case 1 <= i && i <= 2: - i -= 1 - return _State_name_0[_State_index_0[i]:_State_index_0[i+1]] - case i == 4: - return _State_name_1 - case i == 8: - return _State_name_2 - case i == 16: - return _State_name_3 - case i == 32: - return _State_name_4 - default: - return "State(" + strconv.FormatInt(int64(i), 10) + ")" - } -}