Example #1
0
        /// <summary>
        /// Converts a RAPID pro schema definition language file (.rsdl) to a CSDL file
        /// </summary>
        /// <param name="path">file path of input file to parse</param>
        /// <param name="format">indicates whether it should be written as XML or JSON CSDL, or OpenAPI</param>
        public async Task <bool> Convert(string path, OutputFormat format)
        {
            // create parser and model transformer.
            var parser      = new RdmParser(logger);
            var transformer = new ModelTransformer(logger);

            // the model transformer has no ability to parse itself, so do the parsing upfront and
            // pass in the models (main and dependencies)

            // load main model file
            var model = ParseFile(parser, path);

            if (model == null)
            {
                return(false);
            }

            // load referenced models
            var referencedModels = model.References.ToDictionary(
                reference => reference.Alias,
                reference => LoadModel(reference.Path, parser, Path.GetDirectoryName(path)));

            // transform into CSDL
            if (transformer.TryTransform(model, referencedModels, out var csdlModel))
            {
                return(await WriteOutputToFile(csdlModel, path, format));
            }
            else
            {
                return(false);
            }
        }
Example #2
0
        /// <summary>
        /// Converts a RAPID pro schema definition language file (.rsdl) to a CSDL file
        /// </summary>
        /// <param name="inputRsdl">reader to read the RSDL to parse</param>
        /// <param name="output">stream to write the output to</param>
        /// <param name="format">indicates whether it should be written as XML or JSON CSDL, or OpenAPI</param>
        /// <param name="modelName">the name of the model being converted</param>
        public async Task <bool> Convert(TextReader inputRsdl, Stream output, OutputFormat format, string modelName = "RapidModel")
        {
            // create parser and model transformer.
            RdmDataModel model;
            var          parser = new RdmParser(logger);

            try
            {
                var rsdl = await inputRsdl.ReadToEndAsync();

                model = parser.Parse(rsdl, modelName);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"error parsing rsdl stream");
                return(false);
            }

            // todo: Load referenced EDM models

            // transform into CSDL
            var transformer = new ModelTransformer(logger);

            if (transformer.TryTransform(model, null, out var csdlModel))
            {
                return(await WriteOutput(csdlModel, output, format));
            }
            else
            {
                return(false);
            }
        }
Example #3
0
        private rdm.RdmDataModel ParseFile(RdmParser parser, string path)
        {
            try
            {
                var content = File.ReadAllText(path);
                var model   = parser.Parse(content, Path.GetFileName(path));

                return(model);
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"error parsing rsdl file {path}");
                return(default);
Example #4
0
        private RdmDataModel LoadModel(string path, RdmParser parser, string baseDirectory)
        {
            if (!Path.IsPathRooted(path))
            {
                path = Path.Combine(baseDirectory, path);
            }
            if (Path.GetExtension(path) == "")
            {
                path = path + ".rsdl";
            }
            ;

            var model = parser.Parse(File.ReadAllText(path), Path.GetFileName(path));

            logger.LogInfo("loaded referenced model file {0} containing namespace {1}", path, model.Namespace.NamespaceName);
            return(model);
        }