1- namespace VerifyTests ;
1+ namespace VerifyTests ;
22
33public readonly struct Target
44{
5- readonly StringBuilder ? stringBuilderData ;
6- readonly Stream ? streamData ;
7- public string Extension { get ; }
5+ public object ? Data { get ; }
6+ public string ? Extension { get ; }
87 public string ? Name { get ; } = null ;
98 public bool PerformConversion { get ; } = true ;
109 public string NameOrTarget => Name ?? "target" ;
@@ -13,21 +12,23 @@ public Stream StreamData
1312 {
1413 get
1514 {
16- if ( streamData is null )
15+ if ( Data is not Stream stream )
1716 {
18- throw new ( "Use StringData or StringBuilderData ." ) ;
17+ throw new ( "Data is not a Stream. Use Data property to access the underlying data ." ) ;
1918 }
2019
21- return streamData ;
20+ return stream ;
2221 }
2322 }
2423
25- public bool IsStream => streamData is not null ;
26- public bool IsString => stringBuilderData is not null ;
24+ public bool IsStream => Data is Stream ;
25+ public bool IsStringBuilder => Data is StringBuilder ;
26+ public bool IsString => Data is string ;
27+ public bool IsObject => Data is not null && ! IsStream && ! IsStringBuilder && ! IsString ;
2728
2829 internal bool TryGetStringBuilder ( [ NotNullWhen ( true ) ] out StringBuilder ? value )
2930 {
30- if ( stringBuilderData is { } builder )
31+ if ( Data is StringBuilder builder )
3132 {
3233 value = builder ;
3334 return true ;
@@ -37,6 +38,18 @@ internal bool TryGetStringBuilder([NotNullWhen(true)] out StringBuilder? value)
3738 return false ;
3839 }
3940
41+ internal bool TryGetStream ( [ NotNullWhen ( true ) ] out Stream ? value )
42+ {
43+ if ( Data is Stream stream )
44+ {
45+ value = stream ;
46+ return true ;
47+ }
48+
49+ value = null ;
50+ return false ;
51+ }
52+
4053 [ OverloadResolutionPriority ( - 1 ) ]
4154 public Target ( string extension , Stream data , string ? name = null ) :
4255 this ( extension , data , name , true )
@@ -52,29 +65,27 @@ public Target(string extension, Stream data, string? name = null, bool performCo
5265 throw new (
5366 $ """
5467 Don't pass a stream for text.
55- If { extension } is not a text extension then use `FileExtensions.RemoveTextExtensions(\ "{ extension } \ ")` at initialization;
68+ If { extension } is not a text extension then use `FileExtensions.RemoveTextExtensions("{ extension } ")` at initialization;
5669 Otherwise use `Target(string extension, string data)` or `Target(string extension, StringBuilder data, string? name)`.
5770 """ ) ;
5871 }
5972
6073 Extension = extension ;
6174 Name = FileNameCleaner . SanitizeFilePath ( name ) ;
6275 PerformConversion = performConversion ;
63- streamData = data ;
64- stringBuilderData = null ;
76+ Data = data ;
6577 }
6678
6779 public Target ( string extension , StringBuilder data , string ? name = null )
6880 {
69- ValidateExtension ( extension ) ;
81+ ValidateTextExtension ( extension ) ;
7082
7183 Extension = extension ;
7284 Name = FileNameCleaner . SanitizeFilePath ( name ) ;
73- streamData = null ;
74- stringBuilderData = data ;
85+ Data = data ;
7586 }
7687
77- static void ValidateExtension ( string extension )
88+ static void ValidateTextExtension ( string extension )
7889 {
7990 Guards . AgainstBadExtension ( extension ) ;
8091 if ( extension == "noextension" ||
@@ -93,11 +104,22 @@ static void ValidateExtension(string extension)
93104
94105 public Target ( string extension , string data , string ? name = null )
95106 {
96- ValidateExtension ( extension ) ;
107+ ValidateTextExtension ( extension ) ;
97108
98109 Extension = extension ;
99110 Name = FileNameCleaner . SanitizeFilePath ( name ) ;
100- stringBuilderData = new ( data ) ;
101- streamData = null ;
111+ Data = new StringBuilder ( data ) ;
112+ }
113+
114+ /// <summary>
115+ /// Creates a Target wrapping an arbitrary object.
116+ /// The object will be resolved to a stream or string later in the verification pipeline.
117+ /// </summary>
118+ public Target ( object data , string ? name = null )
119+ {
120+ Data = data ;
121+ Extension = null ;
122+ Name = FileNameCleaner . SanitizeFilePath ( name ) ;
123+ PerformConversion = true ;
102124 }
103- }
125+ }
0 commit comments