in DTDLValidator/DTDLValidator/Program.cs [40:169]
static void RunOptions(Options opts)
{
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
string dtdlParserVersion = "<unknown>";
foreach (Assembly a in assemblies)
{
if (a.GetName().Name.EndsWith("DigitalTwins.Parser"))
dtdlParserVersion = a.GetName().Version.ToString();
}
Log.Ok($"Simple DTDL Validator (dtdl parser library version {dtdlParserVersion})");
if (opts.Interactive == true)
{
Log.Alert("Entering interactive mode");
Interactive.Interactive i = new Interactive.Interactive();
return;
}
DirectoryInfo dinfo = null;
try
{
if(opts.Directory != null && opts.Directory != string.Empty)
{
dinfo = new DirectoryInfo(opts.Directory);
Log.Alert($"Validating *.{opts.Extension} files in folder '{dinfo.FullName}'.\nRecursive is set to {opts.Recursive}\n");
if (dinfo.Exists == false)
{
Log.Error($"Specified directory '{opts.Directory}' does not exist: Exiting...");
throw new Exception();
}
}
} catch (Exception e)
{
Log.Error($"Error accessing the target directory '{opts.Directory}': \n{e.Message}");
Environment.Exit(0);
}
SearchOption searchOpt = opts.Recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly;
var files = opts.InputFiles.ToList();
if(dinfo!= null)
{
dinfo.EnumerateFiles($"*.{opts.Extension}", searchOpt).ToList().ForEach(file => files.Add(file.FullName));
}
if (files.Count() == 0)
{
Log.Alert("No matching files found. Exiting.");
return;
}
var modelDict = new Dictionary<string, string>();
int count = 0;
string lastFile = "<none>";
try
{
foreach (var file in files)
{
StreamReader r = new StreamReader(file);
string dtdl = r.ReadToEnd();
r.Close();
modelDict.Add(file, dtdl);
lastFile = file;
count++;
}
} catch (Exception e)
{
Log.Error($"Could not read files. \nLast file read: {lastFile}\nError: \n{e.Message}");
Environment.Exit(0);
}
Log.Ok($"Read {count} files from specified directory");
int errJson = 0;
foreach (string file in modelDict.Keys)
{
modelDict.TryGetValue(file, out string dtdl);
try
{
JsonDocument.Parse(dtdl);
} catch (Exception e)
{
Log.Error($"Invalid json found in file {file}.\nJson parser error \n{e.Message}");
errJson++;
}
}
if (errJson>0)
{
Log.Error($"\nFound {errJson} Json parsing errors");
Environment.Exit(0);
}
Log.Ok($"Validated JSON for all files - now validating DTDL");
List<string> modelList = modelDict.Values.ToList<string>();
ModelParser parser = new ModelParser();
parser.DtmiResolver = new DtmiResolver(Resolver);
try
{
IReadOnlyDictionary<Dtmi, DTEntityInfo> om = parser.Parse(modelList);
Log.Out("");
Log.Ok($"**********************************************");
Log.Ok($"** Validated all files - Your DTDL is valid **");
Log.Ok($"**********************************************");
Log.Out($"Found a total of {om.Keys.Count()} entities");
}
catch (ParsingException pe)
{
Log.Error($"*** Error parsing models");
int derrcount = 1;
foreach (ParsingError err in pe.Errors)
{
Log.Error($"Error {derrcount}:");
Log.Error($"{err.Message}");
Log.Error($"Primary ID: {err.PrimaryID}");
Log.Error($"Secondary ID: {err.SecondaryID}");
Log.Error($"Property: {err.Property}\n");
derrcount++;
}
Environment.Exit(0);
}
catch (ResolutionException ex)
{
Log.Error(ex, "Could not resolve required references");
Environment.Exit(0);
}
}