github.com/ernestokarim/closurer@v0.0.0-20130119214741-f245d086c750/config/structs.go (about) 1 package config 2 3 import ( 4 "github.com/ernestokarim/closurer/app" 5 ) 6 7 type Config struct { 8 Build string `xml:"build,attr"` 9 10 Ignores []*IgnoreNode `xml:"ignore"` 11 Map *MapNode `xml:"map"` 12 Js *JsNode `xml:"js"` 13 Gss *GssNode `xml:"gss"` 14 Soy *SoyNode `xml:"soy"` 15 Library *LibraryNode `xml:"library"` 16 } 17 18 // ================================================================== 19 20 type JsNode struct { 21 Root string `xml:"root,attr"` 22 Compiler string `xml:"compiler,attr"` 23 Language string `xml:"language,attr"` 24 Formatting string `xml:"formatting,attr"` 25 SideEffects string `xml:"side-effects,attr"` 26 27 Checks *ChecksNode `xml:"checks"` 28 Targets []*JsTargetNode `xml:"target"` 29 Inputs []*InputNode `xml:"input"` 30 Externs []*ExternNode `xml:"extern"` 31 Prepends []*PrependNode `xml:"prepend"` 32 } 33 34 func (n *JsNode) CurTarget() *JsTargetNode { 35 if n == nil { 36 return nil 37 } 38 39 for _, t := range n.Targets { 40 if t.Name == SelectedTarget { 41 return t 42 } 43 } 44 return nil 45 } 46 47 // ================================================================== 48 49 type IgnoreNode struct { 50 Path string `xml:"path,attr"` 51 } 52 53 // ================================================================== 54 55 type ChecksNode struct { 56 Errors []*CheckNode `xml:"error"` 57 Warnings []*CheckNode `xml:"warning"` 58 Offs []*CheckNode `xml:"off"` 59 } 60 61 // ================================================================== 62 63 type CheckNode struct { 64 Name string `xml:"name,attr"` 65 } 66 67 // ================================================================== 68 69 type JsTargetNode struct { 70 Name string `xml:"name,attr"` 71 Mode string `xml:"mode,attr"` 72 Level string `xml:"level,attr"` 73 Output string `xml:"output,attr"` 74 Inherits string `xml:"inherits,attr"` 75 76 Defines []*DefineNode `xml:"define"` 77 } 78 79 func (t *JsTargetNode) ApplyInherits() error { 80 if t.Name == "" { 81 return app.Errorf("The name of the target is required") 82 } 83 84 if t.Inherits == "" { 85 return nil 86 } 87 88 for _, parent := range globalConf.Js.Targets { 89 if parent.Name == t.Name { 90 return app.Errorf("Inherits should reference a previous target: %s", t.Name) 91 } 92 if parent.Name != t.Inherits { 93 continue 94 } 95 96 if t.Mode == "" { 97 t.Mode = parent.Mode 98 } 99 if t.Level == "" { 100 t.Level = parent.Level 101 } 102 if t.Output == "" { 103 t.Output = parent.Output 104 } 105 106 for _, d := range parent.Defines { 107 if !t.HasDefine(d.Name) { 108 t.Defines = append(t.Defines, d.Clone()) 109 } 110 } 111 112 return nil 113 } 114 115 panic("not reached") 116 } 117 118 func (t *JsTargetNode) HasDefine(name string) bool { 119 for _, d := range t.Defines { 120 if d.Name == name { 121 return true 122 } 123 } 124 return false 125 } 126 127 // ================================================================== 128 129 type DefineNode struct { 130 Name string `xml:"name,attr"` 131 Value string `xml:"value,attr"` 132 } 133 134 func (d *DefineNode) Clone() *DefineNode { 135 return &DefineNode{ 136 Name: d.Name, 137 Value: d.Value, 138 } 139 } 140 141 // ================================================================== 142 143 type MapNode struct { 144 File string `xml:"file,attr"` 145 } 146 147 // ================================================================== 148 149 type InputNode struct { 150 File string `xml:"file,attr"` 151 } 152 153 // ================================================================== 154 155 type ExternNode struct { 156 File string `xml:"file,attr"` 157 } 158 159 // ================================================================== 160 161 type GssNode struct { 162 Compiler string `xml:"compiler,attr"` 163 164 Targets []*GssTargetNode `xml:"target"` 165 Funcs []*FuncNode `xml:"func"` 166 Inputs []*InputNode `xml:"input"` 167 } 168 169 func (n *GssNode) CurTarget() *GssTargetNode { 170 if n == nil { 171 return nil 172 } 173 174 for _, t := range n.Targets { 175 if t.Name == SelectedTarget { 176 return t 177 } 178 } 179 return nil 180 } 181 182 // ================================================================== 183 184 type GssTargetNode struct { 185 Name string `xml:"name,attr"` 186 Rename string `xml:"rename,attr"` 187 Output string `xml:"output,attr"` 188 Inherits string `xml:"inherits,attr"` 189 190 Defines []*DefineNode `xml:"define"` 191 } 192 193 func (t *GssTargetNode) ApplyInherits() error { 194 if t.Name == "" { 195 return app.Errorf("The name of the target is required") 196 } 197 198 if t.Inherits == "" { 199 return nil 200 } 201 202 for _, parent := range globalConf.Gss.Targets { 203 if parent.Name == t.Name { 204 return app.Errorf("Inherits should reference a previous target: %s", t.Name) 205 } 206 if parent.Name != t.Inherits { 207 continue 208 } 209 210 if t.Rename == "" { 211 t.Rename = parent.Rename 212 } 213 if t.Output == "" { 214 t.Output = parent.Output 215 } 216 217 for _, d := range parent.Defines { 218 if !t.HasDefine(d.Name) { 219 t.Defines = append(t.Defines, d.Clone()) 220 } 221 } 222 223 return nil 224 } 225 226 panic("not reached") 227 } 228 229 func (t *GssTargetNode) HasDefine(name string) bool { 230 for _, d := range t.Defines { 231 if d.Name == name { 232 return true 233 } 234 } 235 return false 236 } 237 238 // ================================================================== 239 240 type SoyNode struct { 241 Root string `xml:"root,attr"` 242 Compiler string `xml:"compiler,attr"` 243 } 244 245 // ================================================================== 246 247 type LibraryNode struct { 248 Root string `xml:"root,attr"` 249 } 250 251 // ================================================================== 252 253 type FuncNode struct { 254 Name string `xml:"name,attr"` 255 } 256 257 // ================================================================== 258 259 type PrependNode struct { 260 File string `xml:"file,attr"` 261 }