@@ -18,16 +18,18 @@ public static class SpectreRenderBridge {
1818 public static string RenderToString ( object renderableObject , bool escapeAnsi = false , int ? width = null ) {
1919 ArgumentNullException . ThrowIfNull ( renderableObject ) ;
2020
21- string rendered = renderableObject is IRenderable localRenderable
22- ? RenderLocal ( localRenderable , width )
23- : RenderForeign ( renderableObject , width ) ;
24-
25- return rendered . Length != 0
26- ? escapeAnsi ? VTHelpers . StripAnsi ( rendered ) : rendered
27- : throw new ArgumentException (
21+ string rendered ;
22+ if ( renderableObject is IRenderable localRenderable ) {
23+ rendered = RenderLocal ( localRenderable , width ) ;
24+ }
25+ else if ( ! TryRenderForeign ( renderableObject , width , out rendered ) ) {
26+ throw new ArgumentException (
2827 $ "Object of type '{ renderableObject . GetType ( ) . FullName } ' does not implement a supported Spectre IRenderable shape.",
2928 nameof ( renderableObject )
3029 ) ;
30+ }
31+
32+ return escapeAnsi ? VTHelpers . StripAnsi ( rendered ) : rendered ;
3133 }
3234
3335 /// <summary>
@@ -87,7 +89,8 @@ private static string RenderLocal(IRenderable renderable, int? width) {
8789 return writer . ToString ( ) ;
8890 }
8991
90- private static string RenderForeign ( object renderableObject , int ? width ) {
92+ private static bool TryRenderForeign ( object renderableObject , int ? width , out string rendered ) {
93+ rendered = string . Empty ;
9194 Type valueType = renderableObject . GetType ( ) ;
9295 Assembly assembly = valueType . Assembly ;
9396
@@ -101,15 +104,15 @@ private static string RenderForeign(object renderableObject, int? width) {
101104 || ansiConsoleSettingsType is null
102105 || ansiConsoleOutputType is null
103106 || foreignRenderableType ? . IsInstanceOfType ( renderableObject ) != true ) {
104- return string . Empty ;
107+ return false ;
105108 }
106109
107110 using StringWriter writer = new ( new StringBuilder ( 1024 ) , CultureInfo . InvariantCulture ) ;
108111 object ? output = Activator . CreateInstance ( ansiConsoleOutputType , writer ) ;
109112 object ? settings = Activator . CreateInstance ( ansiConsoleSettingsType ) ;
110113 PropertyInfo ? outProperty = ansiConsoleSettingsType . GetProperty ( "Out" ) ;
111114 if ( output is null || settings is null || outProperty is null || ! outProperty . CanWrite ) {
112- return string . Empty ;
115+ return false ;
113116 }
114117
115118 outProperty . SetValue ( settings , output ) ;
@@ -121,7 +124,7 @@ private static string RenderForeign(object renderableObject, int? width) {
121124 && parameters [ 0 ] . ParameterType == ansiConsoleSettingsType ) ;
122125 object ? console = createMethod ? . Invoke ( null , [ settings ] ) ;
123126 if ( console is null ) {
124- return string . Empty ;
127+ return false ;
125128 }
126129
127130 if ( width is int targetWidth && targetWidth > 0 ) {
@@ -136,7 +139,8 @@ private static string RenderForeign(object renderableObject, int? width) {
136139 MethodInfo ? writeMethod = console . GetType ( ) . GetMethod ( "Write" , [ foreignRenderableType ] ) ;
137140 if ( writeMethod is not null ) {
138141 _ = writeMethod . Invoke ( console , [ renderableObject ] ) ;
139- return writer . ToString ( ) ;
142+ rendered = writer . ToString ( ) ;
143+ return true ;
140144 }
141145
142146 Type ? extType = assembly . GetType ( "Spectre.Console.AnsiConsoleExtensions" ) ;
@@ -146,11 +150,12 @@ private static string RenderForeign(object renderableObject, int? width) {
146150 && method . GetParameters ( ) is { Length : 2 } parameters
147151 && parameters [ 1 ] . ParameterType == foreignRenderableType ) ;
148152 if ( extWriteMethod is null ) {
149- return string . Empty ;
153+ return false ;
150154 }
151155
152156 _ = extWriteMethod . Invoke ( null , [ console , renderableObject ] ) ;
153- return writer . ToString ( ) ;
157+ rendered = writer . ToString ( ) ;
158+ return true ;
154159 }
155160
156161 private static CallSite < Func < CallSite , object , IRenderable > > CreateConvertToRenderableCallSite ( ) {
0 commit comments