-
Notifications
You must be signed in to change notification settings - Fork 6
/
v0.go
160 lines (127 loc) · 6.44 KB
/
v0.go
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package publiccode
import (
"gopkg.in/yaml.v3"
urlutil "github.com/italia/publiccode-parser-go/v4/internal"
)
// PublicCodeV0 defines how a publiccode.yml v0.x is structured
type PublicCodeV0 struct {
PubliccodeYamlVersion string `yaml:"publiccodeYmlVersion" validate:"required,oneof=0.2 0.2.0 0.2.1 0.2.2 0.3 0.3.0 0.4 0.4.0"`
Name string `yaml:"name" validate:"required"`
ApplicationSuite string `yaml:"applicationSuite,omitempty"`
URL *URL `yaml:"url" validate:"required,url_url"`
LandingURL *URL `yaml:"landingURL,omitempty" validate:"omitnil,url_http_url"`
IsBasedOn UrlOrUrlArray `yaml:"isBasedOn,omitempty"`
SoftwareVersion string `yaml:"softwareVersion,omitempty"`
ReleaseDate *string `yaml:"releaseDate" validate:"omitnil,date"`
Logo string `yaml:"logo,omitempty"`
MonochromeLogo string `yaml:"monochromeLogo,omitempty"`
InputTypes []string `yaml:"inputTypes,omitempty"`
OutputTypes []string `yaml:"outputTypes,omitempty"`
Platforms []string `yaml:"platforms" validate:"gt=0"`
Categories []string `yaml:"categories" validate:"required,gt=0,dive,is_category_v0"`
UsedBy *[]string `yaml:"usedBy,omitempty"`
Roadmap *URL `yaml:"roadmap,omitempty" validate:"omitnil,url_http_url"`
DevelopmentStatus string `yaml:"developmentStatus" validate:"required,oneof=concept development beta stable obsolete"`
SoftwareType string `yaml:"softwareType" validate:"required,oneof=standalone/mobile standalone/iot standalone/desktop standalone/web standalone/backend standalone/other addon library configurationFiles"`
IntendedAudience *struct {
Scope *[]string `yaml:"scope,omitempty" validate:"omitempty,dive,is_scope_v0"`
Countries *[]string `yaml:"countries,omitempty" validate:"omitempty,dive,iso3166_1_alpha2_lowercase"`
UnsupportedCountries *[]string `yaml:"unsupportedCountries,omitempty" validate:"omitempty,dive,iso3166_1_alpha2_lowercase"`
} `yaml:"intendedAudience,omitempty"`
Description map[string]DescV0 `yaml:"description" validate:"gt=0,bcp47_keys,dive"`
Legal struct {
License string `yaml:"license" validate:"required"`
MainCopyrightOwner *string `yaml:"mainCopyrightOwner,omitempty"`
RepoOwner *string `yaml:"repoOwner,omitempty"`
AuthorsFile *string `yaml:"authorsFile,omitempty"`
} `yaml:"legal"`
Maintenance struct {
Type string `yaml:"type" validate:"required,oneof=internal contract community none"`
Contractors []ContractorV0 `yaml:"contractors,omitempty" validate:"required_if=Type contract,dive"`
Contacts []ContactV0 `yaml:"contacts,omitempty" validate:"required_if=Type community,required_if=Type internal,dive"`
} `yaml:"maintenance"`
Localisation struct {
LocalisationReady *bool `yaml:"localisationReady" validate:"required"`
AvailableLanguages []string `yaml:"availableLanguages" validate:"required,gt=0,dive,bcp47_language_tag"`
} `yaml:"localisation"`
DependsOn *struct {
Open *[]DependencyV0 `yaml:"open,omitempty" validate:"omitempty,dive"`
Proprietary *[]DependencyV0 `yaml:"proprietary,omitempty" validate:"omitempty,dive"`
Hardware *[]DependencyV0 `yaml:"hardware,omitempty" validate:"omitempty,dive"`
} `yaml:"dependsOn,omitempty"`
It ITSectionV0 `yaml:"it"`
}
// DescV0 is a general description of the software.
type DescV0 struct {
LocalisedName *string `yaml:"localisedName,omitempty"`
GenericName string `yaml:"genericName" validate:"umax=35"`
ShortDescription string `yaml:"shortDescription" validate:"required,umax=150"`
LongDescription string `yaml:"longDescription,omitempty" validate:"required,umin=150,umax=10000"`
Documentation *URL `yaml:"documentation,omitempty" validate:"omitnil,url_http_url"`
APIDocumentation *URL `yaml:"apiDocumentation,omitempty" validate:"omitnil,url_http_url"`
Features *[]string `yaml:"features,omitempty" validate:"gt=0,dive"`
Screenshots []string `yaml:"screenshots,omitempty"`
Videos []*URL `yaml:"videos,omitempty" validate:"dive,omitnil,url_http_url"`
Awards []string `yaml:"awards,omitempty"`
}
// ContractorV0 is an entity or entities, if any, that are currently contracted for maintaining the software.
type ContractorV0 struct {
Name string `yaml:"name" validate:"required"`
Email *string `yaml:"email,omitempty" validate:"omitempty,email"`
Website *URL `yaml:"website,omitempty" validate:"omitnil,url_http_url"`
Until string `yaml:"until" validate:"required,date"`
}
// ContactV0 is a contact info maintaining the software.
type ContactV0 struct {
Name string `yaml:"name" validate:"required"`
Email *string `yaml:"email,omitempty" validate:"omitempty,email"`
Affiliation *string `yaml:"affiliation,omitempty"`
Phone *string `yaml:"phone,omitempty" validate:"omitempty"`
}
// DependencyV0 describes system-level dependencies required to install and use this software.
type DependencyV0 struct {
Name string `yaml:"name" validate:"required,gt=0"`
VersionMin *string `yaml:"versionMin,omitempty"`
VersionMax *string `yaml:"versionMax,omitempty"`
Optional *bool `yaml:"optional,omitempty"`
Version *string `yaml:"version,omitempty"`
}
// Country-specific sections
//
// While the standard is structured to be meaningful on an international level,
// there are additional information that can be added that makes sense in specific
// countries, such as declaring compliance with local laws or regulations.
type ITSectionV0 struct {
CountryExtensionVersion *string `yaml:"countryExtensionVersion" validate:"omitnil,oneof=0.2 1.0"`
Conforme struct {
LineeGuidaDesign bool `yaml:"lineeGuidaDesign,omitempty"`
ModelloInteroperabilita bool `yaml:"modelloInteroperabilita"`
MisureMinimeSicurezza bool `yaml:"misureMinimeSicurezza"`
GDPR bool `yaml:"gdpr"`
} `yaml:"conforme"`
Riuso struct {
CodiceIPA string `yaml:"codiceIPA,omitempty" validate:"omitempty,is_italian_ipa_code"`
} `yaml:"riuso,omitempty"`
Piattaforme struct {
SPID bool `yaml:"spid"`
PagoPa bool `yaml:"pagopa"`
CIE bool `yaml:"cie"`
ANPR bool `yaml:"anpr"`
Io bool `yaml:"io"`
} `yaml:"piattaforme"`
}
func (p PublicCodeV0) Version() uint {
return 0
}
func (p PublicCodeV0) ToYAML() ([]byte, error) {
return yaml.Marshal(p)
}
func (p PublicCodeV0) Url() *URL {
if p.URL == nil {
return nil
}
if ok, _ := urlutil.IsValidURL(p.URL.String()); ok {
return p.URL
}
return nil
}