1 namespace OpenQA.Selenium.DevToolsGenerator.CodeGen 2 { 3 using Microsoft.Extensions.DependencyInjection; 4 using OpenQA.Selenium.DevToolsGenerator.ProtocolDefinition; 5 using System; 6 using System.Collections.Generic; 7 8 /// <summary> 9 /// Represents a base implementation of a code generator. 10 /// </summary> 11 /// <typeparam name="T"></typeparam> 12 public abstract class CodeGeneratorBase<T> : ICodeGenerator<T> 13 where T : IDefinition 14 { 15 private readonly IServiceProvider m_serviceProvider; 16 private readonly Lazy<CodeGenerationSettings> m_settings; 17 private readonly Lazy<TemplatesManager> m_templatesManager; 18 19 /// <summary> 20 /// Gets the service provider associated with the generator. 21 /// </summary> 22 public IServiceProvider ServiceProvider 23 { 24 get { return m_serviceProvider; } 25 } 26 27 /// <summary> 28 /// Gets the code generation settings associated with the generator. 29 /// </summary> 30 public CodeGenerationSettings Settings 31 { 32 get { return m_settings.Value; } 33 } 34 35 /// <summary> 36 /// Gets a template manager associated with the generator. 37 /// </summary> 38 public TemplatesManager TemplatesManager 39 { 40 get { return m_templatesManager.Value; } 41 } 42 43 protected CodeGeneratorBase(IServiceProvider serviceProvider) 44 { 45 m_serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)); 46 m_settings = new Lazy<CodeGenerationSettings>(() => m_serviceProvider.GetRequiredService<CodeGenerationSettings>()); 47 m_templatesManager = new Lazy<TemplatesManager>(() => m_serviceProvider.GetRequiredService<TemplatesManager>()); 48 } 49 50 public abstract IDictionary<string, string> GenerateCode(T item, CodeGeneratorContext context); 51 } 52 }