| package inflect |
| |
| import ( |
| "fmt" |
| "path/filepath" |
| "strings" |
| |
| "github.com/gobuffalo/envy" |
| ) |
| |
| // Name is a string that represents the "name" of a thing, like an app, model, etc... |
| type Name string |
| |
| // Title version of a name. ie. "foo_bar" => "Foo Bar" |
| func (n Name) Title() string { |
| x := strings.Split(string(n), "/") |
| for i, s := range x { |
| x[i] = Titleize(s) |
| } |
| |
| return strings.Join(x, " ") |
| } |
| |
| // Underscore version of a name. ie. "FooBar" => "foo_bar" |
| func (n Name) Underscore() string { |
| w := string(n) |
| if strings.ToUpper(w) == w { |
| return strings.ToLower(w) |
| } |
| return Underscore(w) |
| } |
| |
| // Plural version of a name |
| func (n Name) Plural() string { |
| return Pluralize(string(n)) |
| } |
| |
| // Singular version of a name |
| func (n Name) Singular() string { |
| return Singularize(string(n)) |
| } |
| |
| // Camel version of a name |
| func (n Name) Camel() string { |
| c := Camelize(string(n)) |
| if strings.HasSuffix(c, "Id") { |
| c = strings.TrimSuffix(c, "Id") |
| c += "ID" |
| } |
| return c |
| } |
| |
| // Model version of a name. ie. "user" => "User" |
| func (n Name) Model() string { |
| x := strings.Split(string(n), "/") |
| for i, s := range x { |
| x[i] = Camelize(Singularize(s)) |
| } |
| |
| return strings.Join(x, "") |
| } |
| |
| // Resource version of a name |
| func (n Name) Resource() string { |
| name := n.Underscore() |
| x := strings.FieldsFunc(name, func(r rune) bool { |
| return r == '_' || r == '/' |
| }) |
| |
| for i, w := range x { |
| if i == len(x)-1 { |
| x[i] = Camelize(Pluralize(strings.ToLower(w))) |
| continue |
| } |
| |
| x[i] = Camelize(w) |
| } |
| |
| return strings.Join(x, "") |
| } |
| |
| // ModelPlural version of a name. ie. "user" => "Users" |
| func (n Name) ModelPlural() string { |
| return Camelize(Pluralize(n.Model())) |
| } |
| |
| // File version of a name |
| func (n Name) File() string { |
| return Underscore(Camelize(string(n))) |
| } |
| |
| // Table version of a name |
| func (n Name) Table() string { |
| return Underscore(Pluralize(string(n))) |
| } |
| |
| // UnderSingular version of a name |
| func (n Name) UnderSingular() string { |
| return Underscore(Singularize(string(n))) |
| } |
| |
| // PluralCamel version of a name |
| func (n Name) PluralCamel() string { |
| return Pluralize(Camelize(string(n))) |
| } |
| |
| // PluralUnder version of a name |
| func (n Name) PluralUnder() string { |
| return Pluralize(Underscore(string(n))) |
| } |
| |
| // URL version of a name |
| func (n Name) URL() string { |
| return n.PluralUnder() |
| } |
| |
| // CamelSingular version of a name |
| func (n Name) CamelSingular() string { |
| return Camelize(Singularize(string(n))) |
| } |
| |
| // VarCaseSingular version of a name. ie. "FooBar" => "fooBar" |
| func (n Name) VarCaseSingular() string { |
| return CamelizeDownFirst(Singularize(Underscore(n.Resource()))) |
| } |
| |
| // VarCasePlural version of a name. ie. "FooBar" => "fooBar" |
| func (n Name) VarCasePlural() string { |
| return CamelizeDownFirst(n.Resource()) |
| } |
| |
| // Lower case version of a string |
| func (n Name) Lower() string { |
| return strings.ToLower(string(n)) |
| } |
| |
| // ParamID returns foo_bar_id |
| func (n Name) ParamID() string { |
| return fmt.Sprintf("%s_id", strings.Replace(n.UnderSingular(), "/", "_", -1)) |
| } |
| |
| // Package returns go package |
| func (n Name) Package() string { |
| key := string(n) |
| |
| for _, gp := range envy.GoPaths() { |
| key = strings.TrimPrefix(key, filepath.Join(gp, "src")) |
| key = strings.TrimPrefix(key, gp) |
| } |
| key = strings.TrimPrefix(key, string(filepath.Separator)) |
| |
| key = strings.Replace(key, "\\", "/", -1) |
| return key |
| } |
| |
| // Char returns first character in lower case, this is useful for methods inside a struct. |
| func (n Name) Char() string { |
| return strings.ToLower(string(n[0])) |
| } |
| |
| func (n Name) String() string { |
| return string(n) |
| } |