1
1
// Copyright (c) .NET Foundation and contributors. All rights reserved.
2
2
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
4
+ using System . Collections . Generic ;
4
5
using System . CommandLine . Help ;
5
6
using System . CommandLine . Invocation ;
6
7
using System . CommandLine . IO ;
7
8
using System . CommandLine . Parsing ;
8
9
using System . Linq ;
9
10
11
+ #nullable enable
12
+
10
13
namespace System . CommandLine . Binding
11
14
{
12
15
public sealed class BindingContext
13
16
{
14
17
private IConsole _console ;
18
+ private readonly Dictionary < Type , ModelBinder > _modelBindersByValueDescriptor = new Dictionary < Type , ModelBinder > ( ) ;
15
19
16
20
public BindingContext (
17
21
ParseResult parseResult ,
18
- IConsole console = null )
22
+ IConsole ? console = default )
19
23
{
20
24
_console = console ?? new SystemConsole ( ) ;
21
25
@@ -25,7 +29,7 @@ public BindingContext(
25
29
26
30
public ParseResult ParseResult { get ; set ; }
27
31
28
- internal IConsoleFactory ConsoleFactory { get ; set ; }
32
+ internal IConsoleFactory ? ConsoleFactory { get ; set ; }
29
33
30
34
internal IHelpBuilder HelpBuilder => ( IHelpBuilder ) ServiceProvider . GetService ( typeof ( IHelpBuilder ) ) ;
31
35
@@ -46,18 +50,16 @@ public IConsole Console
46
50
47
51
internal ServiceProvider ServiceProvider { get ; }
48
52
49
- public void AddService ( Type serviceType , Func < IServiceProvider , object > factory )
50
- {
51
- if ( serviceType == null )
52
- {
53
- throw new ArgumentNullException ( nameof ( serviceType ) ) ;
54
- }
53
+ public void AddModelBinder ( ModelBinder binder ) =>
54
+ _modelBindersByValueDescriptor . Add ( binder . ValueDescriptor . ValueType , binder ) ;
55
55
56
- if ( factory == null )
57
- {
58
- throw new ArgumentNullException ( nameof ( factory ) ) ;
59
- }
56
+ public ModelBinder GetModelBinder ( IValueDescriptor valueDescriptor ) =>
57
+ _modelBindersByValueDescriptor . GetOrAdd (
58
+ valueDescriptor . ValueType ,
59
+ _ => new ModelBinder ( valueDescriptor ) ) ;
60
60
61
+ public void AddService ( Type serviceType , Func < IServiceProvider , object > factory )
62
+ {
61
63
ServiceProvider . AddService ( serviceType , factory ) ;
62
64
}
63
65
@@ -68,31 +70,31 @@ public void AddService<T>(Func<IServiceProvider, T> factory)
68
70
throw new ArgumentNullException ( nameof ( factory ) ) ;
69
71
}
70
72
71
- ServiceProvider . AddService ( typeof ( T ) , s => factory ( s ) ) ;
73
+ ServiceProvider . AddService ( typeof ( T ) , s => factory ( s ) ! ) ;
72
74
}
73
75
74
76
internal bool TryGetValueSource (
75
77
IValueDescriptor valueDescriptor ,
76
- out IValueSource valueSource )
78
+ out IValueSource ? valueSource )
77
79
{
78
- if ( ServiceProvider . AvailableServiceTypes . Contains ( valueDescriptor . Type ) )
80
+ if ( ServiceProvider . AvailableServiceTypes . Contains ( valueDescriptor . ValueType ) )
79
81
{
80
82
valueSource = new ServiceProviderValueSource ( ) ;
81
83
return true ;
82
84
}
83
85
84
- valueSource = null ;
86
+ valueSource = default ;
85
87
return false ;
86
88
}
87
89
88
90
internal bool TryBindToScalarValue (
89
91
IValueDescriptor valueDescriptor ,
90
92
IValueSource valueSource ,
91
- out BoundValue boundValue )
93
+ out BoundValue ? boundValue )
92
94
{
93
95
if ( valueSource . TryGetValue ( valueDescriptor , this , out var value ) )
94
96
{
95
- if ( value == null || valueDescriptor . Type . IsInstanceOfType ( value ) )
97
+ if ( value == null || valueDescriptor . ValueType . IsInstanceOfType ( value ) )
96
98
{
97
99
boundValue = new BoundValue ( value , valueDescriptor , valueSource ) ;
98
100
return true ;
@@ -101,7 +103,7 @@ internal bool TryBindToScalarValue(
101
103
{
102
104
var parsed = ArgumentConverter . ConvertObject (
103
105
valueDescriptor as IArgument ?? new Argument ( valueDescriptor . ValueName ) ,
104
- valueDescriptor . Type ,
106
+ valueDescriptor . ValueType ,
105
107
value ) ;
106
108
107
109
if ( parsed is SuccessfulArgumentConversionResult successful )
@@ -112,7 +114,7 @@ internal bool TryBindToScalarValue(
112
114
}
113
115
}
114
116
115
- boundValue = null ;
117
+ boundValue = default ;
116
118
return false ;
117
119
}
118
120
}
0 commit comments