reset changelog for debian package
[debian/orchestra.git] / src / player / resp_state.go
1 // resp_state.go
2
3 package main
4
5 import (
6         "os"
7         "json"
8 )
9
10 type ResponseState int
11
12 const (
13         // Response states
14         RESP_PENDING                    = ResponseState(iota)   // internal state, not wire.
15         RESP_RUNNING
16         RESP_FINISHED
17         RESP_FAILED
18         RESP_FAILED_UNKNOWN_SCORE
19         RESP_FAILED_HOST_ERROR
20         RESP_FAILED_UNKNOWN
21 )
22
23 func (rs ResponseState) String() (strout string) {
24         switch rs {
25         case RESP_RUNNING:
26                 return "PENDING"
27         case RESP_FINISHED:
28                 return "OK"
29         case RESP_FAILED:
30                 return "FAIL"
31         case RESP_FAILED_UNKNOWN_SCORE:
32                 return "UNK_SCORE"
33         case RESP_FAILED_HOST_ERROR:
34                 return "HOST_ERROR"
35         case RESP_FAILED_UNKNOWN:
36                 return "UNKNOWN_FAILURE"
37         }
38         return ""
39 }
40
41 func (rs ResponseState) MarshalJSON() (out []byte, err os.Error) {
42         strout := rs.String()
43         if strout != "" {
44                 return json.Marshal(strout)
45         }
46         return nil, InvalidValueError
47 }
48
49 func (rs ResponseState) UnmarshalJSON(in []byte) (err os.Error) {
50         var statestr string
51         err = json.Unmarshal(in, &statestr)
52         if err != nil {
53                 return err
54         }
55         switch statestr {
56         case "PENDING":
57                 rs = RESP_PENDING
58         case "OK":
59                 rs = RESP_FINISHED
60         case "FAIL":
61                 rs = RESP_FAILED
62         case "UNK_SCORE":
63                 rs = RESP_FAILED_UNKNOWN_SCORE
64         case "HOST_ERROR":
65                 rs = RESP_FAILED_HOST_ERROR
66         case "UNKNOWN_FAILURE":
67                 rs = RESP_FAILED_UNKNOWN
68         default:
69                 return InvalidValueError
70         }
71         return nil
72 }
73
74 func (rs ResponseState) Finished() bool {
75         switch rs {
76         case RESP_FINISHED:
77                 fallthrough
78         case RESP_FAILED:
79                 fallthrough
80         case RESP_FAILED_UNKNOWN_SCORE:
81                 fallthrough
82         case RESP_FAILED_HOST_ERROR:
83                 fallthrough
84         case RESP_FAILED_UNKNOWN:
85                 return true
86         }
87         return false
88 }
89
90 // true if the response says the task failed.  false otherwise.
91 func (rs ResponseState) Failed() bool {
92         switch rs {
93         case RESP_RUNNING:
94                 fallthrough
95         case RESP_FINISHED:
96                 return false
97         }
98         return true
99 }
100
101 // true if the task can be tried.
102 // precond:  DidFail is true, job is a ONE_OF job.
103 // must return false otherwise.
104 func (rs ResponseState) CanRetry() bool {
105         switch rs {
106         case RESP_FAILED_UNKNOWN_SCORE:
107                 fallthrough
108         case RESP_FAILED_HOST_ERROR:
109                 return true
110         }
111         return false
112 }