22// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33// See the LICENSE file in the project root for more information
44
5+ using System . Collections . Frozen ;
56using System . Collections . Immutable ;
67using System . IO . Abstractions ;
7- using Elastic . Documentation ;
8- using Elastic . Documentation . Configuration ;
98using Elastic . Documentation . Configuration . Assembler ;
9+ using Elastic . Documentation . Configuration . Builder ;
1010using Elastic . Documentation . Configuration . TableOfContents ;
11+ using Elastic . Documentation . Diagnostics ;
1112using Elastic . Documentation . Navigation ;
1213using YamlDotNet . RepresentationModel ;
1314
14- namespace Documentation . Assembler . Navigation ;
15+ namespace Elastic . Documentation . Configuration . Navigation ;
16+
17+ public record NavigationTocMapping
18+ {
19+ public required Uri Source { get ; init ; }
20+ public required string SourcePathPrefix { get ; init ; }
21+ public required Uri TopLevelSource { get ; init ; }
22+ public required Uri ParentSource { get ; init ; }
23+ }
24+
25+ public record TocConfigurationMapping
26+ {
27+ public required NavigationTocMapping TopLevel { get ; init ; }
28+ public required ConfigurationFile RepositoryConfigurationFile { get ; init ; }
29+ public required TableOfContentsConfiguration TableOfContentsConfiguration { get ; init ; }
30+ }
1531
1632public record GlobalNavigationFile : ITableOfContentsScope
1733{
18- private readonly AssembleContext _context ;
19- private readonly AssembleSources _assembleSources ;
34+ //private readonly AssembleContext _context;
35+ private readonly IDiagnosticsCollector _collector ;
36+ private readonly ConfigurationFileProvider _configurationFileProvider ;
37+ private readonly AssemblyConfiguration _configuration ;
38+
39+ private readonly FrozenDictionary < Uri , TocConfigurationMapping > _tocConfigurationMappings ;
40+ //private readonly AssembleSources _assembleSources;
2041
2142 public IReadOnlyCollection < TocReference > TableOfContents { get ; }
2243 public IReadOnlyCollection < TocReference > Phantoms { get ; }
2344
2445 public IDirectoryInfo ScopeDirectory { get ; }
2546
26- public GlobalNavigationFile ( AssembleContext context , AssembleSources assembleSources )
47+ public GlobalNavigationFile (
48+ IDiagnosticsCollector collector ,
49+ ConfigurationFileProvider configurationFileProvider ,
50+ AssemblyConfiguration configuration ,
51+ FrozenDictionary < Uri , TocConfigurationMapping > tocConfigurationMappings
52+ )
2753 {
28- _context = context ;
29- _assembleSources = assembleSources ;
30- NavigationFile = context . ConfigurationFileProvider . CreateNavigationFile ( context . Configuration ) ;
54+ //_context = context;
55+ _collector = collector ;
56+ _configurationFileProvider = configurationFileProvider ;
57+ _configuration = configuration ;
58+ _tocConfigurationMappings = tocConfigurationMappings ;
59+ NavigationFile = configurationFileProvider . CreateNavigationFile ( configuration ) ;
3160 TableOfContents = Deserialize ( "toc" ) ;
3261 Phantoms = Deserialize ( "phantoms" ) ;
3362 ScopeDirectory = NavigationFile . Directory ! ;
3463 }
3564
3665 private IFileInfo NavigationFile { get ; }
3766
38- public static bool ValidatePathPrefixes ( AssembleContext context )
67+ public static bool ValidatePathPrefixes (
68+ IDiagnosticsCollector collector ,
69+ ConfigurationFileProvider configurationFileProvider ,
70+ AssemblyConfiguration configuration
71+ )
3972 {
40- var fileProvider = context . ConfigurationFileProvider ;
41- var sourcePathPrefixes = GetAllPathPrefixes ( context ) ;
73+ var sourcePathPrefixes = GetAllPathPrefixes ( collector , configurationFileProvider , configuration ) ;
4274 var pathPrefixSet = new HashSet < string > ( ) ;
4375 var valid = true ;
4476 foreach ( var pathPrefix in sourcePathPrefixes )
@@ -47,23 +79,36 @@ public static bool ValidatePathPrefixes(AssembleContext context)
4779 if ( pathPrefixSet . Add ( prefix ) )
4880 continue ;
4981 var duplicateOf = sourcePathPrefixes . First ( p => p . Host == pathPrefix . Host && p . AbsolutePath == pathPrefix . AbsolutePath ) ;
50- context . Collector . EmitError ( fileProvider . NavigationFile , $ "Duplicate path prefix: { pathPrefix } duplicate: { duplicateOf } ") ;
82+ collector . EmitError ( configurationFileProvider . NavigationFile , $ "Duplicate path prefix: { pathPrefix } duplicate: { duplicateOf } ") ;
5183 valid = false ;
5284 }
5385 return valid ;
5486 }
5587
5688
57- public static ImmutableHashSet < Uri > GetAllPathPrefixes ( AssembleContext context ) =>
58- GetSourceUris ( "toc" , context ) ;
59-
60- public static ImmutableHashSet < Uri > GetPhantomPrefixes ( AssembleContext context ) =>
61- GetSourceUris ( "phantoms" , context ) ;
62-
63- private static ImmutableHashSet < Uri > GetSourceUris ( string key , AssembleContext context )
89+ public static ImmutableHashSet < Uri > GetAllPathPrefixes (
90+ IDiagnosticsCollector collector ,
91+ ConfigurationFileProvider configurationFileProvider ,
92+ AssemblyConfiguration configuration
93+ ) =>
94+ GetSourceUris ( "toc" , collector , configurationFileProvider , configuration ) ;
95+
96+ public static ImmutableHashSet < Uri > GetPhantomPrefixes (
97+ IDiagnosticsCollector collector ,
98+ ConfigurationFileProvider configurationFileProvider ,
99+ AssemblyConfiguration configuration
100+ ) =>
101+ GetSourceUris ( "phantoms" , collector , configurationFileProvider , configuration ) ;
102+
103+ private static ImmutableHashSet < Uri > GetSourceUris (
104+ string key ,
105+ IDiagnosticsCollector collector ,
106+ ConfigurationFileProvider configurationFileProvider ,
107+ AssemblyConfiguration configuration
108+ )
64109 {
65- var navigationFile = context . ConfigurationFileProvider . CreateNavigationFile ( context . Configuration ) ;
66- var reader = new YamlStreamReader ( navigationFile , context . Collector ) ;
110+ var navigationFile = configurationFileProvider . CreateNavigationFile ( configuration ) ;
111+ var reader = new YamlStreamReader ( navigationFile , collector ) ;
67112 var set = new HashSet < Uri > ( ) ;
68113 foreach ( var entry in reader . Read ( ) )
69114 {
@@ -145,15 +190,15 @@ static void ReadPathPrefixes(YamlStreamReader reader, KeyValuePair<YamlNode, Yam
145190 }
146191 }
147192 public void EmitWarning ( string message ) =>
148- _context . Collector . EmitWarning ( NavigationFile , message ) ;
193+ _collector . EmitWarning ( NavigationFile , message ) ;
149194
150195 public void EmitError ( string message ) =>
151- _context . Collector . EmitError ( NavigationFile , message ) ;
196+ _collector . EmitError ( NavigationFile , message ) ;
152197
153198 private IReadOnlyCollection < TocReference > Deserialize ( string key )
154199 {
155- var navigationFile = _context . ConfigurationFileProvider . CreateNavigationFile ( _context . Configuration ) ;
156- var reader = new YamlStreamReader ( navigationFile , _context . Collector ) ;
200+ var navigationFile = _configurationFileProvider . CreateNavigationFile ( _configuration ) ;
201+ var reader = new YamlStreamReader ( navigationFile , _collector ) ;
157202 try
158203 {
159204 foreach ( var entry in reader . Read ( ) )
@@ -232,7 +277,7 @@ private IReadOnlyCollection<TocReference> ReadChildren(string key, YamlStreamRea
232277 return null ;
233278
234279
235- if ( ! _assembleSources . TocConfigurationMapping . TryGetValue ( sourceUri , out var mapping ) )
280+ if ( ! _tocConfigurationMappings . TryGetValue ( sourceUri , out var mapping ) )
236281 {
237282 reader . EmitError ( $ "Toc entry '{ sourceUri } ' is could not be located", tocEntry ) ;
238283 return null ;
@@ -270,7 +315,7 @@ private IReadOnlyCollection<TocReference> ReadChildren(string key, YamlStreamRea
270315 if ( source is null )
271316 return pathPrefix ;
272317
273- source = source . EndsWith ( "://" ) ? source : source . TrimEnd ( '/' ) + "/" ;
318+ source = source . EndsWith ( "://" , StringComparison . OrdinalIgnoreCase ) ? source : source . TrimEnd ( '/' ) + "/" ;
274319 if ( ! Uri . TryCreate ( source , UriKind . Absolute , out sourceUri ) )
275320 {
276321 reader . EmitError ( $ "Source toc entry is not a valid uri: { source } ", tocEntry ) ;
0 commit comments