diff options
Diffstat (limited to 'src/zen/cmds/workspaces_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/workspaces_cmd.cpp | 142 |
1 files changed, 66 insertions, 76 deletions
diff --git a/src/zen/cmds/workspaces_cmd.cpp b/src/zen/cmds/workspaces_cmd.cpp index 3930e56b7..9bb118eac 100644 --- a/src/zen/cmds/workspaces_cmd.cpp +++ b/src/zen/cmds/workspaces_cmd.cpp @@ -117,7 +117,7 @@ WorkspaceCommand::WorkspaceCommand() WorkspaceCommand::~WorkspaceCommand() = default; -int +void WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_UNUSED(GlobalOptions); @@ -129,12 +129,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments); if (!ParseOptions(ParentCommandArgCount, argv)) { - return 0; + return; } if (SubOption == nullptr) { - throw zen::OptionParseException("command verb is missing"); + throw OptionParseException("'verb' option is required", m_Options.help()); } m_HostName = ResolveTargetHostSpec(m_HostName); @@ -144,7 +144,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) m_SystemRootDir = PickDefaultSystemRootDirectory(); if (m_SystemRootDir.empty()) { - throw zen::OptionParseException("unable to resolve system root directory"); + throw std::runtime_error("Unable to resolve default system root directory"); } } @@ -152,14 +152,14 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data())) { - return 0; + return; } if (SubOption == &m_CreateOptions) { if (m_Path.empty()) { - throw zen::OptionParseException(fmt::format("path is required\n{}", m_CreateOptions.help())); + throw OptionParseException("'--root-path' is required", SubOption->help()); } std::filesystem::path Path = StringToPath(m_Path); @@ -167,12 +167,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) if (m_Id.empty()) { m_Id = Workspaces::PathToId(Path).ToString(); - ZEN_CONSOLE("Using generated workspace id {} from path '{}'", m_Id, Path); + ZEN_CONSOLE("Using generated workspace id '{}' from '--root-path' '{}'", m_Id, Path); } if (Oid::TryFromHexString(m_Id) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help()); } if (Workspaces::AddWorkspace( @@ -185,16 +185,16 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result) { - ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); + ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); } } ZEN_CONSOLE("Added/updated workspace {}", m_Id); - return 0; + return; } else { ZEN_CONSOLE_WARN("Workspace {} already exists", m_Id); - return 0; + return; } } @@ -206,7 +206,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) static std::vector<Workspaces::WorkspaceConfiguration> Configs = Workspaces::ReadConfig(Log(), StatePath, Error); if (!Error.empty()) { - ZEN_CONSOLE_ERROR("Failed to read workspaces state from '{}'. Reason: '{}'", StatePath, Error); + throw std::runtime_error(fmt::format("Failed to read workspaces state from '{}'. Reason: '{}'", StatePath, Error)); } else { @@ -216,20 +216,20 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ShowWorkspace(Config, " "sv); } } - return 0; + return; } else { if (Oid::TryFromHexString(m_Id) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help()); } Workspaces::WorkspaceConfiguration Workspace = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_Id)); if (Workspace.Id != Oid::Zero) { ShowWorkspace(Workspace, ""sv); - return 0; + return; } else { @@ -242,12 +242,12 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { if (m_Id.empty()) { - throw zen::OptionParseException(fmt::format("id is required", m_RemoveOptions.help())); + throw OptionParseException("'--workspace' is required", SubOption->help()); } if (Oid::TryFromHexString(m_Id) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_Id)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_Id), SubOption->help()); } if (Workspaces::RemoveWorkspace(Log(), StatePath, Oid::FromHexString(m_Id))) @@ -257,7 +257,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result) { - ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); + ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); } } ZEN_CONSOLE("Removed workspace {}", m_Id); @@ -266,7 +266,7 @@ WorkspaceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_CONSOLE_WARN("Workspace {} does not exist", m_Id); } - return 0; + return; } ZEN_ASSERT(false); @@ -368,7 +368,7 @@ WorkspaceShareCommand::WorkspaceShareCommand() WorkspaceShareCommand::~WorkspaceShareCommand() = default; -int +void WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { ZEN_UNUSED(GlobalOptions); @@ -380,12 +380,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** int ParentCommandArgCount = GetSubCommand(m_Options, argc, argv, m_SubCommands, SubOption, SubCommandArguments); if (!ParseOptions(ParentCommandArgCount, argv)) { - return 0; + return; } if (SubOption == nullptr) { - throw zen::OptionParseException("command verb is missing"); + throw OptionParseException("'verb' option is required", m_Options.help()); } m_HostName = ResolveTargetHostSpec(m_HostName); @@ -395,7 +395,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** m_SystemRootDir = PickDefaultSystemRootDirectory(); if (m_SystemRootDir.empty()) { - throw zen::OptionParseException("unable to resolve system root directory"); + throw std::runtime_error("Unable to resolve default system root directory"); } } else @@ -407,7 +407,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (!ParseOptions(*SubOption, gsl::narrow<int>(SubCommandArguments.size()), SubCommandArguments.data())) { - return 0; + return; } if (SubOption == &m_CreateOptions) @@ -416,20 +416,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** { if (m_WorkspaceId.empty()) { - throw zen::OptionParseException("workspace id or root path is required"); + throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help()); } Oid WorkspaceId = Oid::TryFromHexString(m_WorkspaceId); if (WorkspaceId == Oid::Zero) { - throw zen::OptionParseException(fmt::format("id '{}' is invalid", m_WorkspaceId)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help()); } Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, WorkspaceId); if (WorkspaceConfig.Id == Oid::Zero) { - ZEN_CONSOLE_ERROR("Workspace {} does not exist", m_WorkspaceId); - return 0; + throw std::runtime_error(fmt::format("Workspace {} does not exist", m_WorkspaceId)); } m_WorkspaceRoot = WorkspaceConfig.RootPath; } @@ -445,7 +444,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** { if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help()); } } if (Workspaces::AddWorkspace(Log(), StatePath, {.Id = Oid::FromHexString(m_WorkspaceId), .RootPath = m_WorkspaceRoot})) @@ -469,7 +468,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (Oid::TryFromHexString(m_ShareId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_ShareId), SubOption->help()); } if (Workspaces::AddWorkspaceShare(Log(), @@ -481,16 +480,14 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result) { - ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); + ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); } } ZEN_CONSOLE("Created workspace share {}", m_ShareId); - return 0; } else { ZEN_CONSOLE("Workspace share {} already exists", m_ShareId); - return 0; } } @@ -503,50 +500,47 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** Workspaces::FindWorkspaceShare(Log(), StatePath, m_Alias, WorkspaceConfig); if (ShareConfig.Id == Oid::Zero) { - ZEN_CONSOLE("Workspace share with alias {} does not exist", m_Alias); - return 0; + throw std::runtime_error(fmt::format("Workspace share with alias {} does not exist", m_Alias)); } ShowShare(ShareConfig, WorkspaceConfig.Id, ""sv); - return 0; + return; } if (m_WorkspaceId.empty()) { - throw zen::OptionParseException("workspace id or root path is required"); + throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help()); } if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help()); } Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_WorkspaceId)); if (WorkspaceConfig.Id == Oid::Zero) { - ZEN_CONSOLE("Workspace {} does not exist", m_WorkspaceId); - return 0; + throw std::runtime_error(fmt::format("Workspace {} does not exist", m_WorkspaceId)); } std::filesystem::path WorkspaceRoot = WorkspaceConfig.RootPath; if (m_ShareId.empty()) { - throw zen::OptionParseException("share id is required"); + throw OptionParseException("'--share' is required", SubOption->help()); } if (Oid::TryFromHexString(m_ShareId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId)); + throw OptionParseException(fmt::format("'--share' ('{}') is malformed", m_ShareId), SubOption->help()); } Workspaces::WorkspaceShareConfiguration Share = Workspaces::FindWorkspaceShare(Log(), WorkspaceRoot, Oid::FromHexString(m_ShareId)); if (Share.Id == Oid::Zero) { - ZEN_CONSOLE("Workspace share {} does not exist", m_ShareId); - return 0; + throw std::runtime_error(fmt::format("Workspace share {} does not exist", m_ShareId)); } ShowShare(Share, Oid::Zero, ""sv); - return 0; + return; } if (SubOption == &m_RemoveOptions) @@ -560,7 +554,7 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (ShareConfig.Id == Oid::Zero) { ZEN_CONSOLE("Workspace share with alias {} does not exist", m_Alias); - return 0; + return; } m_ShareId = ShareConfig.Id.ToString(); m_WorkspaceId = WorkspaceConfig.Id.ToString(); @@ -569,30 +563,30 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (m_WorkspaceId.empty()) { - throw zen::OptionParseException("workspace id or root path is required"); + throw OptionParseException("'--workspace' or '--root-path' is required", SubOption->help()); } if (Oid::TryFromHexString(m_WorkspaceId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_WorkspaceId)); + throw OptionParseException(fmt::format("'--workspace' ('{}') is malformed", m_WorkspaceId), SubOption->help()); } Workspaces::WorkspaceConfiguration WorkspaceConfig = Workspaces::FindWorkspace(Log(), StatePath, Oid::FromHexString(m_WorkspaceId)); if (WorkspaceConfig.Id == Oid::Zero) { ZEN_CONSOLE("Workspace {} does not exist", m_WorkspaceId); - return 0; + return; } WorkspaceRoot = WorkspaceConfig.RootPath; if (m_ShareId.empty()) { - throw zen::OptionParseException("share id is required"); + throw OptionParseException("'--share' is required", SubOption->help()); } if (Oid::TryFromHexString(m_ShareId) == Oid::Zero) { - throw zen::OptionParseException(fmt::format("workspace id '{}' is invalid", m_ShareId)); + throw OptionParseException(fmt::format("'--share' ('{}') is malformed", m_ShareId), SubOption->help()); } if (Workspaces::RemoveWorkspaceShare(Log(), WorkspaceRoot, Oid::FromHexString(m_ShareId))) @@ -602,16 +596,16 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get("/ws/refresh"); !Result) { - ZEN_CONSOLE_ERROR("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); + ZEN_CONSOLE_WARN("Failed to refresh workspaces for host {}. Reason: '{}'", m_HostName, Result.ErrorMessage(""sv)); } } ZEN_CONSOLE("Removed workspace share {}", m_ShareId); - return 0; + return; } else { ZEN_CONSOLE("Removed workspace share {} does not exist", m_ShareId); - return 0; + return; } } @@ -620,12 +614,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** { if (m_WorkspaceId.empty()) { - throw zen::OptionParseException("workspace id is required"); + throw OptionParseException("'--workspace' is required", Opts.help()); } if (m_ShareId.empty()) { - throw zen::OptionParseException(fmt::format("share id is required", Opts.help())); + throw OptionParseException("'--share' is required", Opts.help()); } return fmt::format("{}/{}", m_WorkspaceId, m_ShareId); } @@ -649,20 +643,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (m_HostName.empty()) { - throw zen::OptionParseException("unable to resolve server specification"); + throw OptionParseException("Unable to resolve server specification", SubOption->help()); } HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/files", GetShareIdentityUrl(m_FilesOptions)), {}, Params)) { ZEN_CONSOLE("{}: {}", Result, Result.ToText()); - return 0; } else { Result.ThrowError("failed to get workspace share files"sv); - return 1; } + return; } if (SubOption == &m_EntriesOptions) @@ -683,20 +676,19 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (m_HostName.empty()) { - throw zen::OptionParseException("unable to resolve server specification"); + throw OptionParseException("Unable to resolve server specification", SubOption->help()); } HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/entries", GetShareIdentityUrl(m_EntriesOptions)), {}, Params)) { ZEN_CONSOLE("{}: {}", Result, Result.ToText()); - return 0; } else { Result.ThrowError("failed to get workspace share entries"sv); - return 1; } + return; } auto ChunksToOidStrings = [](HttpClient& Http, @@ -751,14 +743,14 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (SubOption == &m_GetChunkOptions) { - if (m_ChunkId.empty()) + if (m_HostName.empty()) { - throw zen::OptionParseException("chunk id is required"); + throw OptionParseException("Unable to resolve server specification", SubOption->help()); } - if (m_HostName.empty()) + if (m_ChunkId.empty()) { - throw zen::OptionParseException("unable to resolve server specification"); + throw OptionParseException("'--chunk' is required", SubOption->help()); } HttpClient Http(m_HostName); @@ -777,30 +769,29 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** if (HttpClient::Response Result = Http.Get(fmt::format("/ws/{}/{}", GetShareIdentityUrl(m_GetChunkOptions), m_ChunkId), {}, Params)) { ZEN_CONSOLE("{}: Bytes: {}", Result, NiceBytes(Result.ResponsePayload.GetSize())); - return 0; } else { Result.ThrowError("failed to get workspace share chunk"sv); - return 1; } + return; } if (SubOption == &m_GetChunkBatchOptions) { - if (m_ShareId.empty()) + if (m_HostName.empty()) { - throw zen::OptionParseException(fmt::format("share id is required", m_InfoOptions.help())); + throw OptionParseException("Unable to resolve server specification", SubOption->help()); } - if (m_ChunkIds.empty()) + if (m_ShareId.empty()) { - throw zen::OptionParseException("share is is required"); + throw OptionParseException("'--share' is required", SubOption->help()); } - if (m_HostName.empty()) + if (m_ChunkIds.empty()) { - throw zen::OptionParseException("unable to resolve server specification"); + throw OptionParseException("'--chunks' is required", SubOption->help()); } HttpClient Http(m_HostName); @@ -832,13 +823,12 @@ WorkspaceShareCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** { ZEN_CONSOLE("{}: Bytes: {}", m_ChunkIds[Index], NiceBytes(Results[Index].GetSize())); } - return 0; } else { Result.ThrowError("failed to get workspace share batch"sv); - return 1; } + return; } ZEN_ASSERT(false); |