From b8adf1d4e1b67f6667c15d2d2e9251928f7af0cf Mon Sep 17 00:00:00 2001 From: Dan Engelbrecht Date: Wed, 6 Nov 2024 09:48:15 +0100 Subject: project name list improvement (#211) * provide shorter project store name in list when not conflicting --- src/zen/cmds/projectstore_cmd.cpp | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/zen/cmds/projectstore_cmd.cpp b/src/zen/cmds/projectstore_cmd.cpp index afcf71346..a0118576b 100644 --- a/src/zen/cmds/projectstore_cmd.cpp +++ b/src/zen/cmds/projectstore_cmd.cpp @@ -328,6 +328,36 @@ namespace { return SB.ToString(); } + std::string FmtProjectIdArray(const std::vector& ProjectIds, + std::string_view Separator = ", "sv, + std::string_view Quotes = "'"sv) + { + std::vector PrettyProjectIds; + PrettyProjectIds.reserve(ProjectIds.size()); + for (const std::string& ProjectId : ProjectIds) + { + auto PrettyProjectId = [Quotes, &ProjectIds](const std::string& ProjectId) -> std::string { + if (std::string::size_type DotPos = ProjectId.find('.'); DotPos != std::string::npos) + { + const std::string ConflictProjectId = ProjectId.substr(0, DotPos + 1); + auto It = std::find_if(ProjectIds.begin(), + ProjectIds.end(), + [&ProjectId, &ConflictProjectId](const std::string& CheckForConflictProjectId) { + return (ProjectId != CheckForConflictProjectId) && + CheckForConflictProjectId.starts_with(ConflictProjectId); + }); + if (It == ProjectIds.end()) + { + return fmt::format("{}{}{} ({})", Quotes, ProjectId.substr(0, DotPos), Quotes, ProjectId); + } + } + return fmt::format("{}{}{}", Quotes, ProjectId, Quotes); + }; + PrettyProjectIds.push_back(PrettyProjectId(ProjectId)); + } + return FmtArray(PrettyProjectIds, Separator, ""); + } + std::string ResolveProject(HttpClient& Http, std::string_view OptionalProjectName) { std::vector AvailableProjects = GetProjectIds(Http); @@ -352,7 +382,7 @@ namespace { } else { - ZEN_CONSOLE("Available projects at {}: {}", Http.GetBaseUri(), FmtArray(AvailableProjects)); + ZEN_CONSOLE("Available projects at {}: {}", Http.GetBaseUri(), FmtProjectIdArray(AvailableProjects)); return {}; } } @@ -363,7 +393,7 @@ namespace { ZEN_CONSOLE("Unable to match project name '{}' at {}, available projects: {}", OptionalProjectName, Http.GetBaseUri(), - FmtArray(AvailableProjects)); + FmtProjectIdArray(AvailableProjects)); return {}; } @@ -375,7 +405,7 @@ namespace { ZEN_CONSOLE("Project name is ambigous '{}' at {}: possible matches: {}", OptionalProjectName, Http.GetBaseUri(), - FmtArray(MatchingProjectIds)); + FmtProjectIdArray(MatchingProjectIds)); return {}; } -- cgit v1.2.3