func homeDir(userName string) (string, error) { u, err := user.Lookup(userName) if err != nil { return "", errors.NewUserNotFound(err, "no such user") } return u.HomeDir, nil }
// homeDir returns a local user home dir on Windows // user.Lookup() does not populate Gid and HomeDir on Windows, // so we get it from the registry func homeDir(user string) (string, error) { u, err := getUserSID(user) if err != nil { return "", errors.NewUserNotFound(err, "no such user") } return homeFromRegistry(u) }
// RestoreError makes a best effort at converting the given error // back into an error originally converted by ServerError(). func RestoreError(err error) error { err = errors.Cause(err) if apiErr, ok := err.(*params.Error); !ok { return err } else if apiErr == nil { return nil } if params.ErrCode(err) == "" { return err } msg := err.Error() if singleton, ok := singletonError(err); ok { return singleton } // TODO(ericsnow) Support the other error types handled by ServerError(). switch { case params.IsCodeUnauthorized(err): return errors.NewUnauthorized(nil, msg) case params.IsCodeNotFound(err): // TODO(ericsnow) UnknownModelError should be handled here too. // ...by parsing msg? return errors.NewNotFound(nil, msg) case params.IsCodeUserNotFound(err): return errors.NewUserNotFound(nil, msg) case params.IsCodeAlreadyExists(err): return errors.NewAlreadyExists(nil, msg) case params.IsCodeNotAssigned(err): return errors.NewNotAssigned(nil, msg) case params.IsCodeHasAssignedUnits(err): // TODO(ericsnow) Handle state.HasAssignedUnitsError here. // ...by parsing msg? return err case params.IsCodeHasHostedModels(err): return err case params.IsCodeNoAddressSet(err): // TODO(ericsnow) Handle isNoAddressSetError here. // ...by parsing msg? return err case params.IsCodeNotProvisioned(err): return errors.NewNotProvisioned(nil, msg) case params.IsCodeUpgradeInProgress(err): // TODO(ericsnow) Handle state.UpgradeInProgressError here. // ...by parsing msg? return err case params.IsCodeMachineHasAttachedStorage(err): // TODO(ericsnow) Handle state.HasAttachmentsError here. // ...by parsing msg? return err case params.IsCodeNotSupported(err): return errors.NewNotSupported(nil, msg) case params.IsBadRequest(err): return errors.NewBadRequest(nil, msg) case params.IsMethodNotAllowed(err): return errors.NewMethodNotAllowed(nil, msg) case params.ErrCode(err) == params.CodeDischargeRequired: // TODO(ericsnow) Handle DischargeRequiredError here. return err default: return err } }