private IModelMerger CreateCsvLoader(CsvProjectModelPopulator modelPopulator, ProjectModel projectModel, AppSettings settings) { // Create the normalizer. This reads the CSV file itself and transforms the rows into a // fixed format that will be consumed by the loader. var normalizer = serviceProvider.GetRequiredService <ICsvNormalizer>(); // TODO - verify the path exists, and if not, throw an exception normalizer.Path = modelPopulator.Path; // Create the CSV-to-XSD translator var csvToXsd = serviceProvider.GetRequiredService <ICsvToXsdTranslator>(); csvToXsd.Input = normalizer; // TODO - make debugging an optional flag, either on the command-line or perhaps in the project file csvToXsd.DebugDumpPath = Path.Combine(settings.TempDir, $"{projectModel.Id}-csvToXsd.json"); // Create the XSD-to-model translator var xsdToModel = XsdToModel(csvToXsd, modelPopulator.Path, projectModel); xsdToModel.ShortName = "csv"; // Clean things up a bit var cleaner = Clean(xsdToModel); // Wrap it all up in a merger return(Merge(cleaner)); }
private void ParseCsvPopulator(ProjectModel model, ProjectLexer lexer) { var populator = new CsvProjectModelPopulator { Type = ProjectModelPopulatorType.Csv }; model.Populators.Add(populator); lexer.Consume(TokenKind.LeftCurly); while (lexer.Token.Kind == TokenKind.Keyword) { var keyword = lexer.Consume(TokenKind.Keyword); switch (keyword) { case "path": populator.Path = ConsumeFile(lexer); OptionallyConsume(lexer, TokenKind.Semicolon); break; default: throw new ParserException($"Unexpected populator keyword: {keyword}.", lexer.Token); } } lexer.Consume(TokenKind.RightCurly); }