initialise repo
[debian/orchestra.git] / src / conductor / job_state.go
1 // job_state.go
2
3 package main
4
5 import (
6         "os"
7         "json"
8 )
9
10 type JobState int
11
12 const (
13         JOB_STATE_INVALID       = JobState(iota)
14         // Job is pending resolution
15         JOB_PENDING
16         // Job has completed and has no failures.
17         JOB_SUCCESSFUL
18         // Job has completed and has mixed results.
19         JOB_FAILED_PARTIAL
20         // Job has completed and has completely failed.
21         JOB_FAILED
22 )
23
24 func (js JobState) Finished() bool {
25         if js == JOB_PENDING {
26                 return false
27         }
28         return true
29 }
30
31 func (js JobState) String() (strout string) {
32         switch js {
33         case JOB_PENDING:
34                 strout = "PENDING"
35         case JOB_SUCCESSFUL:
36                 strout = "OK"
37         case JOB_FAILED:
38                 strout = "FAIL"
39         case JOB_FAILED_PARTIAL:
40                 strout = "PARTIAL_FAIL"
41         default:
42                 strout = ""
43         }
44         return strout
45
46 }
47
48 func (js JobState) MarshalJSON() (out []byte, err os.Error) {
49         strout := js.String()
50         if strout != "" {
51                 return json.Marshal(strout)
52         }
53         return nil, InvalidValueError
54 }
55
56 func (js *JobState) UnmarshalJSON(in []byte) (err os.Error) {
57         var statestr string
58         err = json.Unmarshal(in, &statestr)
59         if err != nil {
60                 return err
61         }
62         switch statestr {
63         case "PENDING":
64                 *js = JOB_PENDING
65         case "OK":
66                 *js = JOB_SUCCESSFUL
67         case "FAIL":
68                 *js = JOB_FAILED
69         case "PARTIAL_FAIL":
70                 *js = JOB_FAILED_PARTIAL
71         default:
72                 return InvalidValueError
73         }
74         return nil
75 }
76