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  }