public static bool TryParseMetadataNames(IEnumerable<string> values, out ImmutableArray<MetadataName> metadataNames) { ImmutableArray<MetadataName>.Builder builder = null; foreach (string value in values) { if (!MetadataName.TryParse(value, out MetadataName metadataName)) { WriteLine($"Unable to parse metadata name '{value}'.", Verbosity.Quiet); return false; } (builder ?? (builder = ImmutableArray.CreateBuilder<MetadataName>())).Add(metadataName); } metadataNames = builder?.ToImmutableArray() ?? ImmutableArray<MetadataName>.Empty; return true; }
public static void TestTryParse3() { const string x = "+Foo"; Assert.False(MetadataName.TryParse(x, out MetadataName _)); }
public static void TestTryParse_Null() { const string x = null; Assert.False(MetadataName.TryParse(x, out MetadataName _)); }
public static void TestTryParse6() { const string x = "A+B.C+D"; Assert.False(MetadataName.TryParse(x, out MetadataName _)); }
// TODO: Put strings into the resources. // TODO_HIGH: Use SubjectMaterializer component to load metadata. // protected override async Task <IVh <IMetadata> > DoLoadMetadataAsync(IMetadataLoadContext loadCtx) { loadCtx.EnsureNotNull(nameof(loadCtx)); // loadCtx.ThrowIfCancellationRequested(); await Task.CompletedTask; return(doLoad()); // IVh <IMetadata> doLoad() { var locDeserializedObjectAsIDisposable = default(IDisposable); try { var locFormatMediaTypeName = FormatMediaTypeName; var locLocationUri = LocationUri; // string locLoadFilePath; if (locLocationUri.IsAbsoluteUri) { locLoadFilePath = locLocationUri.LocalPath; } else { var locBaseUri = loadCtx.BaseUri; string locBaseUriValidationErrorMessage; if (!locBaseUri.IsAbsoluteUri) { throw new EonException( message: $"Базовый URI контекста загрузки метаданных не может быть использован для разрешения полного пути к файлу загрузки метаданных '{locLocationUri}'.{Environment.NewLine}{FormatXResource(typeof(Uri), "NotAbsoluteUri", locBaseUri.FmtStr().G())}{Environment.NewLine}\tКонтекст загрузки:{loadCtx.FmtStr().GNLI()}"); } else if (!P_IsLocationUriValid(locBaseUri, out locBaseUriValidationErrorMessage)) { throw new EonException( message: $"Базовый URI контекста загрузки метаданных не может быть использован для разрешения полного пути к файлу загрузки метаданных '{locLocationUri}'.{Environment.NewLine}{locBaseUriValidationErrorMessage}{Environment.NewLine}\tКонтекст загрузки:{loadCtx.FmtStr().GNLI2()}"); } locLoadFilePath = Path.Combine(Path.GetDirectoryName(locBaseUri.LocalPath), locLocationUri.ToString()); } var locLoadFile = new FileInfo(locLoadFilePath); if (!locLoadFile.Exists) { throw new FileNotFoundException(FormatXResource(locator: typeof(FileNotFoundException), subpath: null, args: new[] { locLoadFile.FullName }), locLoadFile.FullName); } // IMetadata locLoadedMetadata; object locDeserializedObject; if (IsXmlMediaType(locFormatMediaTypeName)) { try { using (var locFileStream = locLoadFile.OpenRead()) using (var locXmlReader = XmlReader.Create(locFileStream, loadCtx.CreateXmlReaderSettings())) { var locSerializer = loadCtx.CreateXmlObjectSerializer(typeof(object)); locDeserializedObjectAsIDisposable = (locDeserializedObject = locSerializer.ReadObject(reader: locXmlReader, verifyObjectName: false)) as IDisposable; } if (locDeserializedObject is IMetadata locMetadata) { if (locMetadata.IsAutoName && MetadataName.TryParse(value: Path.GetFileNameWithoutExtension(path: locLoadFile.Name), result: out var metadataName)) { locMetadata.Name = metadataName; } locLoadedMetadata = locMetadata; } else if (!(locDeserializedObject is null)) { throw new EonException(message: $"Десериализованный объект имеет тип '{locDeserializedObject.GetType()}', который не совместим с типом '{typeof(IMetadata)}'."); } else { locLoadedMetadata = null; } } catch (Exception exception) { throw new EonException(message: $"Ошибка загрузки объекта из файла.{Environment.NewLine}\tФайл:{locLoadFile.FullName.FmtStr().GNLI2()}.", innerException: exception); } }