mirror of https://github.com/docker/docs.git
58 lines
962 B
Go
58 lines
962 B
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type ErrEmptyStack struct {
|
|
action string
|
|
}
|
|
|
|
func (err ErrEmptyStack) Error() string {
|
|
return fmt.Sprintf("attempted to %s with empty stack", err.action)
|
|
}
|
|
|
|
type ErrBadTypeCast struct{}
|
|
|
|
func (err ErrBadTypeCast) Error() string {
|
|
return "attempted to do a typed pop and item was not of type"
|
|
}
|
|
|
|
type Stack []interface{}
|
|
|
|
func NewStack() *Stack {
|
|
s := make(Stack, 0)
|
|
return &s
|
|
}
|
|
|
|
func (s *Stack) Push(item interface{}) {
|
|
*s = append(*s, item)
|
|
}
|
|
|
|
func (s *Stack) Pop() (interface{}, error) {
|
|
l := len(*s)
|
|
if l > 0 {
|
|
item := (*s)[l-1]
|
|
*s = (*s)[:l-1]
|
|
return item, nil
|
|
}
|
|
return nil, ErrEmptyStack{action: "pop"}
|
|
}
|
|
|
|
func (s *Stack) PopString() (string, error) {
|
|
l := len(*s)
|
|
if l > 0 {
|
|
item := (*s)[l-1]
|
|
if item, ok := item.(string); ok {
|
|
*s = (*s)[:l-1]
|
|
return item, nil
|
|
}
|
|
return "", ErrBadTypeCast{}
|
|
}
|
|
return "", ErrEmptyStack{action: "pop"}
|
|
}
|
|
|
|
func (s Stack) Empty() bool {
|
|
return len(s) == 0
|
|
}
|