11namespace Microsoft . ComponentDetection . Contracts
22{
33#pragma warning disable SA1402
4- public abstract class DockerReference
4+ public class DockerReference
55 {
6- public abstract DockerReferenceKind Kind { get ; }
6+ public virtual DockerReferenceKind Kind { get ; }
77
8- public abstract TypedComponent . DockerReferenceComponent ToTypedDockerReferenceComponent ( ) ;
8+ public virtual TypedComponent . DockerReferenceComponent ToTypedDockerReferenceComponent ( )
9+ {
10+ throw new System . NotImplementedException ( ) ;
11+ }
12+
13+ public static DockerReference CreateDockerReference ( string repository , string domain , string digest , string tag )
14+ {
15+ if ( ! string . IsNullOrEmpty ( repository ) && string . IsNullOrEmpty ( domain ) )
16+ {
17+ if ( ! string . IsNullOrEmpty ( digest ) )
18+ {
19+ return new DigestReference
20+ {
21+ Digest = digest ,
22+ } ;
23+ }
24+ else
25+ {
26+ throw new System . InvalidOperationException ( "Repository name must have at least one component" ) ;
27+ }
28+ }
29+ else if ( string . IsNullOrEmpty ( tag ) )
30+ {
31+ if ( string . IsNullOrEmpty ( digest ) )
32+ {
33+ return new CanonicalReference
34+ {
35+ Domain = domain ,
36+ Repository = repository ,
37+ Digest = digest ,
38+ } ;
39+ }
40+ else
41+ {
42+ return new RepositoryReference
43+ {
44+ Domain = domain ,
45+ Repository = repository ,
46+ } ;
47+ }
48+ }
49+ else if ( string . IsNullOrEmpty ( digest ) )
50+ {
51+ return new TaggedReference
52+ {
53+ Domain = domain ,
54+ Repository = repository ,
55+ Tag = tag ,
56+ } ;
57+ }
58+ else
59+ {
60+ return new DualReference
61+ {
62+ Domain = domain ,
63+ Repository = repository ,
64+ Tag = tag ,
65+ Digest = digest ,
66+ } ;
67+ }
68+ }
969 }
1070
1171 public enum DockerReferenceKind
@@ -20,19 +80,19 @@ public enum DockerReferenceKind
2080 public class Reference
2181 {
2282 public string Tag { get ; set ; }
23-
83+
2484 public string Digest { get ; set ; }
25-
85+
2686 public string Repository { get ; set ; }
27-
87+
2888 public string Domain { get ; set ; }
2989 }
3090
3191 // sha256:abc123...
3292 public class DigestReference : DockerReference
3393 {
3494 public override DockerReferenceKind Kind { get ; } = DockerReferenceKind . Digest ;
35-
95+
3696 public string Digest ;
3797
3898 public override string ToString ( )
@@ -53,11 +113,11 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
53113 public class CanonicalReference : DockerReference
54114 {
55115 public override DockerReferenceKind Kind { get ; } = DockerReferenceKind . Canonical ;
56-
116+
57117 public string Domain ;
58-
118+
59119 public string Repository ;
60-
120+
61121 public string Digest ;
62122
63123 public override string ToString ( )
@@ -80,11 +140,11 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
80140 public class RepositoryReference : DockerReference
81141 {
82142 public override DockerReferenceKind Kind { get ; } = DockerReferenceKind . Repository ;
83-
143+
84144 public string Domain ;
85-
145+
86146 public string Repository ;
87-
147+
88148 public override string ToString ( )
89149 {
90150 return $ "{ Repository } ";
@@ -104,13 +164,13 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
104164 public class TaggedReference : DockerReference
105165 {
106166 public override DockerReferenceKind Kind { get ; } = DockerReferenceKind . Tagged ;
107-
167+
108168 public string Domain ;
109-
169+
110170 public string Repository ;
111-
171+
112172 public string Tag ;
113-
173+
114174 public override string ToString ( )
115175 {
116176 return $ "{ Domain } /{ Repository } :${ Tag } ";
@@ -131,13 +191,13 @@ public override TypedComponent.DockerReferenceComponent ToTypedDockerReferenceCo
131191 public class DualReference : DockerReference
132192 {
133193 public override DockerReferenceKind Kind { get ; } = DockerReferenceKind . Dual ;
134-
194+
135195 public string Domain ;
136-
196+
137197 public string Repository ;
138-
198+
139199 public string Tag ;
140-
200+
141201 public string Digest ;
142202
143203 public override string ToString ( )
0 commit comments