6using System.Collections.Generic;
19 internal static class ProcessOutputReader
38 public static List<WinGetPackage> ToPackageList(
string[] output, PackageAction action = PackageAction.Default,
string? sourceName =
null)
44 int labelLine = output.GetEntryContains(
"------") - 1;
49 return new List<WinGetPackage>();
52 int[] columnList = GetColumnList(output[labelLine]);
55 output = output.RemoveRange(0, labelLine + 2);
57 return CreatePackageListFromOutput(output, columnList, action, sourceName);
78 private static List<WinGetPackage> CreatePackageListFromOutput(
string[] output,
int[] columnList, PackageAction action = PackageAction.Default,
string? sourceName =
null)
80 List<WinGetPackage> resultList =
new();
82 if (columnList.Length < 3)
87 WinGetPackageBuilder builder =
new();
89 for (
int i = 0; i < output.Length; i++)
94#if NETCOREAPP3_1_OR_GREATER
95 if (
string.IsNullOrWhiteSpace(output[i]) || output[i].Length < columnList[^1])
100 if (
string.IsNullOrWhiteSpace(output[i]) || output[i].Length < columnList[columnList.Length - 1])
106#if NETCOREAPP3_1_OR_GREATER
107 builder.AddId(output[i][columnList[1]..columnList[2]].Trim());
109 builder.AddId(output[i].Substring(columnList[1], (columnList[2] - columnList[1])).Trim());
112#if NETCOREAPP3_1_OR_GREATER
113 builder.AddName(output[i][columnList[0]..columnList[1]].Trim());
115 builder.AddName(output[i].Substring(columnList[0], (columnList[1] - columnList[0])).Trim());
119 if (columnList.Length > 3)
121#if NETCOREAPP3_1_OR_GREATER
122 builder.AddVersion(output[i][columnList[2]..columnList[3]].Trim());
123 builder.AddAvailableVersion(output[i][columnList[2]..columnList[3]].Trim());
125 builder.AddVersion(output[i].Substring(columnList[2], (columnList[3] - columnList[2])).Trim());
126 builder.AddAvailableVersion(output[i].Substring(columnList[2], (columnList[3] - columnList[2])).Trim());
131#if NETCOREAPP3_1_OR_GREATER
132 builder.AddVersion(output[i][columnList[2]..].Trim());
133 builder.AddAvailableVersion(output[i][columnList[2]..].Trim());
135 builder.AddVersion(output[i].Substring(columnList[2]).Trim());
136 builder.AddAvailableVersion(output[i].Substring(columnList[2]).Trim());
141 if ((action == PackageAction.UpgradeList || action == PackageAction.InstalledList || action == PackageAction.Search) && columnList.Length >= 5)
143#if NETCOREAPP3_1_OR_GREATER
144 string availableVersion = output[i][columnList[3]..columnList[4]].Trim();
146 string availableVersion = output[i].Substring(columnList[3], (columnList[4] - columnList[3])).Trim();
148 if (!
string.IsNullOrWhiteSpace(availableVersion) && action != PackageAction.Search)
150 builder.AddAvailableVersion(availableVersion);
153#if NETCOREAPP3_1_OR_GREATER
154 builder.AddSourceName(output[i][columnList[4]..].Trim());
156 builder.AddSourceName(output[i].Substring(columnList[4]).Trim());
159 else if ((action == PackageAction.InstalledList || action == PackageAction.Search) && columnList.Length == 4)
161#if NETCOREAPP3_1_OR_GREATER
162 builder.AddSourceName(output[i][columnList[3]..].Trim());
164 builder.AddSourceName(output[i].Substring(columnList[3]).Trim());
167 else if ((action == PackageAction.SearchBySource || action == PackageAction.InstalledListBySource)
168 && sourceName !=
null && !
string.IsNullOrWhiteSpace(sourceName))
172 builder.AddSourceName(sourceName);
175 resultList.Add(builder.GetInstance());
179 if (output.GetEntryContains(
"------") != -1)
181 List<WinGetPackage> seconderyList = ToPackageList(output, action);
182 resultList.AddRange(seconderyList);
200 public static List<WinGetPinnedPackage> ToPinnedPackageList(
string[] output)
206 int labelLine = output.GetEntryContains(
"------") - 1;
211 return new List<WinGetPinnedPackage>();
214 int[] columnList = GetColumnList(output[labelLine],
true);
217 output = output.RemoveRange(0, labelLine + 2);
219 return CreatePinnedPackageListFromOutput(output, columnList);
234 private static List<WinGetPinnedPackage> CreatePinnedPackageListFromOutput(
string[] output,
int[] columnList)
236 List<WinGetPinnedPackage> resultList =
new();
238 if (columnList.Length < 3)
243 WinGetPinnedPackageBuilder builder =
new();
245 for (
int i = 0; i < output.Length; i++)
250#if NETCOREAPP3_1_OR_GREATER
251 if (
string.IsNullOrWhiteSpace(output[i]) || output[i].Length < columnList[^1])
256 if (
string.IsNullOrWhiteSpace(output[i]) || output[i].Length < columnList[columnList.Length - 1])
262#if NETCOREAPP3_1_OR_GREATER
263 builder.AddName(output[i][columnList[0]..columnList[1]].Trim());
264 builder.AddId(output[i][columnList[1]..columnList[2]].Trim());
265 builder.AddVersion(output[i][columnList[2]..columnList[3]].Trim());
266 builder.AddSourceName(output[i][columnList[3]..columnList[4]].Trim());
269 builder.AddName(output[i].Substring(columnList[0], (columnList[1] - columnList[0])).Trim());
270 builder.AddId(output[i].Substring(columnList[1], (columnList[2] - columnList[1])).Trim());
271 builder.AddVersion(output[i].Substring(columnList[2], (columnList[3] - columnList[2])).Trim());
272 builder.AddSourceName(output[i].Substring(columnList[3], (columnList[4] - columnList[3])).Trim());
277#if NETCOREAPP3_1_OR_GREATER
278 string pinInfoString = output[i][columnList[4]..].TrimStart();
280 string pinInfoString = output[i].Substring(columnList[4]).TrimStart();
282 int endOfTypeIndex = -1;
283 for (
int j = 0; j < pinInfoString.Length; j++)
285 if (pinInfoString[j] == (
char)32)
292#if NETCOREAPP3_1_OR_GREATER
293 if (endOfTypeIndex == -1)
295 builder.AddPinType(pinInfoString.Trim());
299 builder.AddPinType(pinInfoString[0..endOfTypeIndex].Trim());
300 builder.AddPinnedVersion(pinInfoString[endOfTypeIndex..].Trim());
303 if (endOfTypeIndex == -1)
305 builder.AddPinType(pinInfoString.Trim());
309 builder.AddPinType(pinInfoString.Substring(0, endOfTypeIndex).Trim());
310 builder.AddPinnedVersion(pinInfoString.Substring(endOfTypeIndex));
315 resultList.Add(builder.GetInstance());
319 if (output.GetEntryContains(
"------") != -1)
321 List<WinGetPinnedPackage> seconderyList = ToPinnedPackageList(output);
322 resultList.AddRange(seconderyList);
340 public static List<WinGetSource> ToSourceList(
string[] output)
342 List<WinGetSource> sourceList =
new();
344 for (
int i = 0; i < output.Length; i++)
346 SourceModel? source =
347 JsonHelper.StringToObject<SourceModel>(output[i]);
368 public static WinGetInfo ToWingetInfo(
string[] output, InfoActionVersionId actionVersionId)
370 if (output.Length <= 0)
375 return ReadDataByRange(output, actionVersionId);
383 private static string ReadVersionFromData(
string[] output)
385 string version =
string.Empty;
387 string[] versionLineContent = output[0].Split((
char)32);
388 for (
int i = 0; i < versionLineContent.Length; i++)
390#if NETCOREAPP3_1_OR_GREATER
391 if (versionLineContent[i].Trim().StartsWith(
'v'))
393 version = versionLineContent[i].Trim()[1..];
397 if (versionLineContent[i].Trim().StartsWith(
"v"))
399 version = versionLineContent[i].Trim().Substring(1);
416 private static WinGetInfo ReadDataByRange(
string[] output, InfoActionVersionId actionVersionId)
418 return actionVersionId
switch
420 InfoActionVersionId.VersionRange1 => ReadDataForRange1(output),
421 InfoActionVersionId.VersionRange2 => ReadDataForRange2(output),
422 InfoActionVersionId.VersionRange3 => ReadDataForRange3(output),
423 InfoActionVersionId.VersionRange4 => ReadDataForRange4(output),
435 private static WinGetInfo ReadDataForRange1(
string[] output)
437 WinGetInfoBuilder builder =
new();
439 string version = ReadVersionFromData(output);
441 if (
string.IsNullOrWhiteSpace(version))
447 builder.AddVersion(version);
450 builder.AddDirectory(ReadSingleDirectoryEntry(output, 7));
453 output = output.RemoveRange(0, 11);
455 builder.AddLinks(ReadLinks(output));
457 return builder.GetInstance();
467 private static WinGetInfo ReadDataForRange2(
string[] output)
469 WinGetInfoBuilder builder =
new();
471 string version = ReadVersionFromData(output);
473 if (
string.IsNullOrWhiteSpace(version))
479 builder.AddVersion(version);
482 builder.AddDirectory(ReadSingleDirectoryEntry(output, 7));
485 builder.AddDirectory(ReadSingleDirectoryEntry(output, 9));
488 output = output.RemoveRange(0, 13);
490 builder.AddLinks(ReadLinks(output));
492 return builder.GetInstance();
502 private static WinGetInfo ReadDataForRange3(
string[] output)
504 WinGetInfoBuilder builder =
new();
506 string version = ReadVersionFromData(output);
508 if (
string.IsNullOrWhiteSpace(version))
514 builder.AddVersion(version);
517 builder.AddDirectory(ReadSingleDirectoryEntry(output, 7));
520 builder.AddDirectory(ReadSingleDirectoryEntry(output, 9));
523 output = output.RemoveRange(0, 13);
525 builder.AddLinks(ReadLinks(output));
528 output = output.RemoveRange(0, output.GetEntryContains(
"----") + 1);
530 builder.AddAdminOptions(ReadAdminSettings(output));
532 return builder.GetInstance();
542 private static WinGetInfo ReadDataForRange4(
string[] output)
544 WinGetInfoBuilder builder =
new();
546 string version = ReadVersionFromData(output);
548 if (
string.IsNullOrWhiteSpace(version))
554 builder.AddVersion(version);
557 output = output.RemoveRange(0, 9);
559 builder.AddDirectories(ReadDirectories(output));
562 output = output.RemoveRange(0, output.GetEntryContains(
"----") + 1);
564 builder.AddLinks(ReadLinks(output));
567 output = output.RemoveRange(0, output.GetEntryContains(
"----") + 1);
569 builder.AddAdminOptions(ReadAdminSettings(output));
571 return builder.GetInstance();
582 private static WinGetDirectory? ReadSingleDirectoryEntry(
string[] output,
int index)
584 string[] entry = output[index].Split(
':');
585 if (entry.Length == 2)
587 WinGetDirectoryBuilder builder =
new();
589 builder.AddEntryName(entry[0].Trim());
590 builder.AddRawContent(entry[1].Trim());
592 return builder.GetInstance();
607 private static List<WinGetDirectory> ReadDirectories(
string[] output)
609 List<WinGetDirectory> directories =
new();
611 StringBuilder nameBuilder =
new();
612 StringBuilder contentBuilder =
new();
614 WinGetDirectoryBuilder directoryBuilder =
new();
616 for (
int i = 0; i < output.Length; i++)
618 directoryBuilder.Clear();
620 if (
string.IsNullOrWhiteSpace(output[i]))
625 string[] directoryEntry = output[i].Split((
char)32).RemoveEmptyEntries();
628 int startOfDirectory = 0;
629 for (
int j = 0; j < directoryEntry.Length; j++)
631#if NETCOREAPP3_1_OR_GREATER
632 if (directoryEntry[j].StartsWith(
'%') || directoryEntry[j].Contains(
":\\"))
635 startOfDirectory = j;
639 if (directoryEntry[j].StartsWith(
"%") || directoryEntry[j].Contains(
":\\"))
642 startOfDirectory = j;
650 nameBuilder.Append((
char)32);
653 nameBuilder.Append(directoryEntry[j].Trim());
656 directoryBuilder.AddEntryName(nameBuilder.ToString());
658 directoryEntry = directoryEntry.RemoveRange(0, startOfDirectory);
660 contentBuilder.Clear();
661 for (
int j = 0; j < directoryEntry.Length; j++)
666 contentBuilder.Append((
char)32);
669 contentBuilder.Append(directoryEntry[j].Trim());
672 directoryBuilder.AddRawContent(contentBuilder.ToString());
675 if (winGetDirectory !=
null)
677 directories.Add(winGetDirectory);
694 private static List<WinGetLink> ReadLinks(
string[] output)
696 List<WinGetLink> links =
new();
698 StringBuilder nameBuilder =
new();
700 WinGetLinkBuilder linkBuilder =
new();
702 for (
int i = 0; i < output.Length; i++)
706 if (
string.IsNullOrWhiteSpace(output[i]))
711 string[] linksEntry = output[i].Split((
char)32).RemoveEmptyEntries();
713#if NETCOREAPP3_1_OR_GREATER
714 linkBuilder.AddRawContent(linksEntry[^1].Trim());
716 linkBuilder.AddRawContent(linksEntry[linksEntry.Length - 1].Trim());
720 linksEntry = linksEntry.RemoveRange(linksEntry.Length - 1, 1);
723 for (
int j = 0; j < linksEntry.Length; j++)
728 nameBuilder.Append((
char)32);
730 nameBuilder.Append(linksEntry[j].Trim());
733 linkBuilder.AddEntryName(nameBuilder.ToString());
735 WinGetLink? winGetLink = linkBuilder.GetInstance();
736 if (winGetLink !=
null)
738 links.Add(winGetLink);
755 private static List<WinGetAdminSetting> ReadAdminSettings(
string[] output)
757 List<WinGetAdminSetting> adminSetting =
new();
759 WinGetAdminSettingBuilder adminOptionBuilder =
new();
761 for (
int i = 0; i < output.Length; i++)
763 adminOptionBuilder.Clear();
765 if (
string.IsNullOrWhiteSpace(output[i]))
770 string[] settingsEntry = output[i].Split((
char)32).RemoveEmptyEntries();
772 if (settingsEntry.Length == 2)
774 adminOptionBuilder.AddEntryName(settingsEntry[0].Trim());
775 adminOptionBuilder.AddRawContent(settingsEntry[1].Trim());
778 if (adminOption !=
null)
780 adminSetting.Add(adminOption);
799 public static string ResultToHash(ProcessResult result)
803#if NETCOREAPP3_1_OR_GREATER
804 if (result.Output.Length > 0 && result.Output[0].Contains(
':'))
806 string[] splitOutput = result.Output[0].Split(
':');
807 if (splitOutput.Length >= 2)
809 hash = splitOutput[1].Trim();
813 if (result.Output.Length > 0 && result.Output[0].Contains(
":"))
815 string[] splitOutput = result.Output[0].Split(
':');
816 if (splitOutput.Length >= 2)
818 hash = splitOutput[1].Trim();
837 public static string ExportOutputToString(ProcessResult result)
841 StringBuilder outputBuilder =
new();
842 foreach (
string line
in result.Output)
844 outputBuilder.Append(line);
847 return outputBuilder.ToString().Trim();
867 private static int[] GetColumnList(
string line,
bool isPinnedPackageTable =
false)
869 int[] columns = Array.Empty<
int>();
871 bool checkForColumn =
true;
872 for (
int i = 0; i < line.Length; i++)
874 if (isPinnedPackageTable && columns.Length >= 5)
880 if (line[i] != ((
char)32) && checkForColumn)
882 columns = columns.Add(i);
883 checkForColumn =
false;
885 else if (line[i] == ((
char)32))
887 checkForColumn =
true;
Represents a winget admin settings entry.
Represents a winget directory in the info set.
Represents winget related information.
Represents a winget link in the info set.
Represents a winget source.