public Either <RfcErrorInfo, T> FromAbapValue <T>(AbapValue abapValue) { if (abapValue is T tv) { return(tv); } T value = default; foreach (var converter in _converterResolver.GetFromRfcConverters <T>(abapValue.FieldInfo.Type, abapValue.GetType())) { var result = converter.ConvertTo(abapValue)(); if (result.IsFaulted) { continue; } result.IfSucc(v => value = v); break; } if (value == null) { return(new RfcErrorInfo(RfcRc.RFC_CONVERSION_FAILURE, RfcErrorGroup.EXTERNAL_APPLICATION_FAILURE, "", $"Converting from abap type {abapValue.FieldInfo.Type} to type {typeof(T)} is not supported.", "", "E", "", "", "", "", "")); } return(Prelude.Right <RfcErrorInfo, T>(value)); }
public Either <RfcErrorInfo, AbapValue> ToAbapValue <T>(T value, RfcFieldInfo fieldInfo) { AbapValue abapValue = null; if (value is AbapValue av) { return(av); } foreach (var converter in _converterResolver.GetToRfcConverters <T>(fieldInfo.Type)) { var result = converter.ConvertFrom(value, fieldInfo)(); if (result.IsFaulted) { continue; } result.IfSucc(v => abapValue = v); break; } if (abapValue == null) { return(new RfcErrorInfo(RfcRc.RFC_CONVERSION_FAILURE, RfcErrorGroup.EXTERNAL_APPLICATION_FAILURE, "", $"Converting from type {typeof(T)} to abap type {fieldInfo.Type} is not supported.", "", "E", "", "", "", "", "")); } return(abapValue); }
public Try <DateTime> ConvertTo(AbapValue abapValue) { return(Prelude.Try(() => { if (!(abapValue is AbapStringValue stringValue)) { throw new ArgumentException($"DateTimeConverter cannot convert type {abapValue.GetType()}", nameof(abapValue)); } DateTime dateTime; // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault switch (stringValue.FieldInfo.Type) { case RfcType.DATE: if (stringValue.Value == "00000000" || stringValue.Value == string.Empty) { dateTime = DateTime.MinValue; } else { dateTime = DateTime.ParseExact(stringValue.Value, "yyyyMMdd", CultureInfo.InvariantCulture); } break; case RfcType.TIME: if (stringValue.Value == "000000" || stringValue.Value == string.Empty) { dateTime = DateTime.MinValue; } else { dateTime = default(DateTime).Add( DateTime.ParseExact(stringValue.Value, "HHmmss", CultureInfo.InvariantCulture).TimeOfDay); } break; default: throw new NotSupportedException( $"It is not supported to convert RfcType {abapValue.FieldInfo.Type} to DateTime"); } return dateTime; })); }
public Try <byte[]> ConvertTo(AbapValue abapValue) { return(Prelude.Try(() => (abapValue as AbapByteValue)?.Value)); }
public Try <T> ConvertTo(AbapValue abapValue) { return(Prelude.Try(() => (T)Convert.ChangeType(abapValue, typeof(T), CultureInfo.InvariantCulture))); }