-
Notifications
You must be signed in to change notification settings - Fork 925
Expand file tree
/
Copy pathCargoPkgDetailsHelper.cs
More file actions
112 lines (97 loc) · 3.65 KB
/
Copy pathCargoPkgDetailsHelper.cs
File metadata and controls
112 lines (97 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using UniGetUI.Core.IconEngine;
using UniGetUI.PackageEngine.Classes.Manager.BaseProviders;
using UniGetUI.PackageEngine.Interfaces;
using UniGetUI.PackageEngine.ManagerClasses.Classes;
namespace UniGetUI.PackageEngine.Managers.CargoManager;
internal sealed class CargoPkgDetailsHelper(Cargo manager) : BasePkgDetailsHelper(manager)
{
protected override void GetDetails_UnSafe(IPackageDetails details)
{
details.InstallerType = "Source";
INativeTaskLogger logger = Manager.TaskLogger.CreateNew(
Enums.LoggableTaskType.LoadPackageDetails
);
Uri manifestUrl;
CargoManifest manifest;
try
{
(manifestUrl, manifest) = CratesIOClient.GetManifest(details.Package.Id);
}
catch (Exception ex)
{
logger.Error(ex);
logger.Close(1);
return;
}
details.Description = manifest.crate.description;
details.ManifestUrl = manifestUrl;
var homepage =
manifest.crate.homepage ?? manifest.crate.repository ?? manifest.crate.documentation;
if (!string.IsNullOrEmpty(homepage))
{
details.HomepageUrl = new Uri(homepage);
}
var keywords = manifest.crate.keywords is null
? []
: (string[])manifest.crate.keywords.Clone();
var categories = manifest.categories?.Select(c => c.category) ?? [];
details.Tags = [.. keywords, .. categories];
var versionData = manifest.versions.FirstOrDefault(v =>
v.num == details.Package.VersionString
);
if (versionData is not null)
{
details.Author = versionData.published_by?.name;
details.License = versionData.license;
details.InstallerUrl = new Uri(
(CratesIOClient.ApiUrl + versionData.dl_path).Replace("/api/v1/api/v1", "/api/v1")
);
details.InstallerSize = versionData.crate_size ?? 0;
details.InstallerHash = versionData.checksum;
details.Publisher = versionData.published_by?.name;
details.UpdateDate = versionData.updated_at;
}
// TODO: most packages are hosted on Github; see if there's a way to use the repository
// info to extract release notes
logger.Close(0);
return;
}
protected override CacheableIcon? GetIcon_UnSafe(IPackage package)
{
throw new NotImplementedException();
}
protected override IReadOnlyList<Uri> GetScreenshots_UnSafe(IPackage package)
{
throw new NotImplementedException();
}
protected override string? GetInstallLocation_UnSafe(IPackage package)
{
// Cargo installs binaries into $CARGO_HOME/bin (default ~/.cargo/bin).
var cargoHome = Environment.GetEnvironmentVariable("CARGO_HOME");
if (string.IsNullOrEmpty(cargoHome))
cargoHome = Path.Join(
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
".cargo"
);
return Path.Join(cargoHome, "bin");
}
protected override IReadOnlyList<string> GetInstallableVersions_UnSafe(IPackage package)
{
INativeTaskLogger logger = Manager.TaskLogger.CreateNew(
Enums.LoggableTaskType.LoadPackageVersions
);
try
{
var (_, manifest) = CratesIOClient.GetManifest(package.Id);
var versions = manifest.versions.Select((v) => v.num).ToArray();
logger.Close(0);
return versions;
}
catch (Exception ex)
{
logger.Error(ex);
logger.Close(1);
throw;
}
}
}