mirror of
https://github.com/dolthub/dolt.git
synced 2026-03-18 09:40:59 -05:00
Made Resolve return an error on unknown type, rather than panic
This commit is contained in:
@@ -74,7 +74,9 @@ func runCommit(ctx context.Context, args []string) int {
|
||||
absPath, err := spec.NewAbsolutePath(path)
|
||||
util.CheckError(err)
|
||||
|
||||
value := absPath.Resolve(ctx, db, vrw)
|
||||
value, err := absPath.Resolve(ctx, db, vrw)
|
||||
util.CheckError(err)
|
||||
|
||||
if value == nil {
|
||||
util.CheckErrorNoUsage(errors.New(fmt.Sprintf("Error resolving value: %s", path)))
|
||||
}
|
||||
|
||||
@@ -161,7 +161,9 @@ func argumentToValue(ctx context.Context, arg string, db datas.Database, vrw typ
|
||||
if arg[0] == '@' {
|
||||
p, err := spec.NewAbsolutePath(arg[1:])
|
||||
d.PanicIfError(err)
|
||||
return p.Resolve(ctx, db, vrw), nil
|
||||
resolve, err := p.Resolve(ctx, db, vrw)
|
||||
d.PanicIfError(err)
|
||||
return resolve, nil
|
||||
}
|
||||
if n, err := strconv.ParseFloat(arg, 64); err == nil {
|
||||
return types.Float(n), nil
|
||||
|
||||
@@ -107,7 +107,12 @@ func nomsStructDel(ctx context.Context, specStr string, args []string) int {
|
||||
func splitPath(ctx context.Context, db datas.Database, sp spec.Spec) (rootVal types.Value, basePath types.Path) {
|
||||
rootPath := sp.Path
|
||||
rootPath.Path = types.Path{}
|
||||
rootVal = rootPath.Resolve(ctx, db, sp.GetVRW(ctx))
|
||||
var err error
|
||||
rootVal, err = rootPath.Resolve(ctx, db, sp.GetVRW(ctx))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if rootVal == nil {
|
||||
util.CheckError(fmt.Errorf("Invalid path: %s", sp.String()))
|
||||
return
|
||||
|
||||
@@ -170,5 +170,10 @@ func (r *Resolver) GetPath(ctx context.Context, str string) (datas.Database, typ
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
return sp.GetDatabase(ctx), sp.GetVRW(ctx), sp.GetValue(ctx), nil
|
||||
value, err := sp.GetValue(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
|
||||
return sp.GetDatabase(ctx), sp.GetVRW(ctx), value, nil
|
||||
}
|
||||
|
||||
@@ -27,8 +27,6 @@ import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/d"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/datas"
|
||||
"github.com/dolthub/dolt/go/store/hash"
|
||||
"github.com/dolthub/dolt/go/store/types"
|
||||
@@ -103,11 +101,13 @@ func NewAbsolutePath(str string) (AbsolutePath, error) {
|
||||
}
|
||||
|
||||
// Resolve returns the Value reachable by 'p' in 'db'.
|
||||
func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.ValueReadWriter) (val types.Value) {
|
||||
func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.ValueReadWriter) (val types.Value, err error) {
|
||||
if len(p.Dataset) > 0 {
|
||||
var ok bool
|
||||
ds, err := db.GetDataset(ctx, p.Dataset)
|
||||
d.PanicIfError(err)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if val, ok = ds.MaybeHead(); !ok {
|
||||
val = nil
|
||||
@@ -115,7 +115,9 @@ func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.
|
||||
} else if !p.Hash.IsEmpty() {
|
||||
var err error
|
||||
val, err = vrw.ReadValue(ctx, p.Hash)
|
||||
d.PanicIfError(err)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
panic("Unreachable")
|
||||
}
|
||||
@@ -123,7 +125,9 @@ func (p AbsolutePath) Resolve(ctx context.Context, db datas.Database, vrw types.
|
||||
if val != nil && p.Path != nil {
|
||||
var err error
|
||||
val, err = p.Path.Resolve(ctx, val, vrw)
|
||||
d.PanicIfError(err)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -159,7 +163,11 @@ func ReadAbsolutePaths(ctx context.Context, db datas.Database, vrw types.ValueRe
|
||||
return nil, fmt.Errorf("invalid input path '%s'", ps)
|
||||
}
|
||||
|
||||
v := p.Resolve(ctx, db, vrw)
|
||||
v, err := p.Resolve(ctx, db, vrw)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if v == nil {
|
||||
return nil, fmt.Errorf("input path '%s' does not exist in database", ps)
|
||||
}
|
||||
|
||||
@@ -396,9 +396,12 @@ func (sp Spec) GetDataset(ctx context.Context) (ds datas.Dataset) {
|
||||
|
||||
// GetValue returns the Value at this Spec's Path within its Database, or nil
|
||||
// if this isn't a Path Spec or if that path isn't found.
|
||||
func (sp Spec) GetValue(ctx context.Context) (val types.Value) {
|
||||
func (sp Spec) GetValue(ctx context.Context) (val types.Value, err error) {
|
||||
if !sp.Path.IsEmpty() {
|
||||
val = sp.Path.Resolve(ctx, sp.GetDatabase(ctx), sp.GetVRW(ctx))
|
||||
val, err = sp.Path.Resolve(ctx, sp.GetDatabase(ctx), sp.GetVRW(ctx))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user