elvish/eval/string.go

57 lines
1.1 KiB
Go
Raw Normal View History

2016-02-19 05:52:05 +08:00
package eval
import "github.com/elves/elvish/parse"
// String is just a string.
type String string
func (String) Kind() string {
return "string"
}
func (s String) Repr(int) string {
2016-02-19 05:52:05 +08:00
return quote(string(s))
}
func (s String) String() string {
return string(s)
}
2016-02-19 18:49:19 +08:00
func (s String) Len() int {
return len(string(s))
}
2016-03-02 08:35:13 +08:00
// Call resolves a command name to either a Fn variable or external command and
// calls it.
func (s String) Call(ec *EvalCtx, args []Value, opts map[string]Value) {
resolve(string(s), ec).Call(ec, args, opts)
2016-02-19 05:52:05 +08:00
}
func resolve(s string, ec *EvalCtx) FnValue {
2016-02-19 05:52:05 +08:00
// Try variable
2016-03-21 07:35:21 +08:00
splice, ns, name := ParseVariable(string(s))
2016-02-19 05:52:05 +08:00
if !splice {
if v := ec.ResolveVar(ns, FnPrefix+name); v != nil {
if caller, ok := v.Get().(FnValue); ok {
2016-02-19 05:52:05 +08:00
return caller
}
}
}
// External command
return ExternalCmd{string(s)}
}
// ToString converts a Value to String. When the Value type implements
2016-02-20 03:31:54 +08:00
// String(), it is used. Otherwise Repr(NoPretty) is used.
2016-02-19 05:52:05 +08:00
func ToString(v Value) string {
if s, ok := v.(Stringer); ok {
return s.String()
}
2016-02-20 03:31:54 +08:00
return v.Repr(NoPretty)
2016-02-19 05:52:05 +08:00
}
func quote(s string) string {
return parse.Quote(s)
}