private static IErlObject coreToErlObject(object o, ErlTypeOrder etp, bool strict) { var eh = strict ? ConvertErrorHandling.Throw : ConvertErrorHandling.ReturnDefault; var e = o as IErlObject; if (e != null) { return(e); } try { switch (etp) { case ErlTypeOrder.ErlObject: case ErlTypeOrder.ErlAtom: return(new ErlAtom(o.ToString())); case ErlTypeOrder.ErlBinary: return(new ErlBinary((byte[])o)); case ErlTypeOrder.ErlBoolean: return(new ErlBoolean(o.AsBool(handling: eh))); case ErlTypeOrder.ErlByte: return(new ErlByte(o.AsByte(handling: eh))); case ErlTypeOrder.ErlDouble: return(new ErlDouble(o.AsDouble(handling: eh))); case ErlTypeOrder.ErlLong: return(new ErlLong(o.AsLong(handling: eh))); case ErlTypeOrder.ErlList: { var list = new ErlList(); foreach (var item in (IEnumerable)o) { list.Add(item.ToErlObject()); } return(list); } case ErlTypeOrder.ErlString: return(new ErlString(o.AsString(handling: eh))); case ErlTypeOrder.ErlTuple: return(new ErlTuple((object[])o)); case ErlTypeOrder.ErlPid: case ErlTypeOrder.ErlPort: case ErlTypeOrder.ErlRef: case ErlTypeOrder.ErlVar: default: throw new Exception(); } } catch (Exception) { throw new ErlException (StringConsts.ERL_CANNOT_CONVERT_TYPES_ERROR, o.GetType().ToString(), etp.ToString()); } }
private static IErlObject coreToErlObject(object o) { // Erlang terms if (o is IErlObject) { return((IErlObject)o); } // Native types if (o is int) { return(new ErlLong((int)o)); } else if (o is uint) { return(new ErlLong((uint)o)); } else if (o is long) { return(new ErlLong((long)o)); } else if (o is ulong) { return(new ErlLong((long)(ulong)o)); } else if (o is double) { return(new ErlDouble((double)o)); } else if (o is float) { return(new ErlDouble((float)o)); } else if (o is string) { return(new ErlString((string)o)); } else if (o is bool) { return(new ErlBoolean((bool)o)); } else if (o is char) { return(new ErlByte((char)o)); } else if (o is byte) { return(new ErlByte((byte)o)); } else if (o is short) { return(new ErlLong((short)o)); } else if (o is ushort) { return(new ErlLong((ushort)o)); } else if (o is decimal) { return(new ErlDouble((double)(decimal)o)); } else if (o is DateTime) { var ts = ((DateTime)o).ToMicrosecondsSinceUnixEpochStart(); var s = ts / 1000000; var us = ts - (s * 1000000); return((IErlObject) new ErlTuple(s / 1000000, s % 1000000, us)); } else if (o is byte[]) { return(new ErlBinary((byte[])o, true)); } // TODO: Add support for IDictionary else if (o is IEnumerable) { var list = new ErlList(); foreach (var item in (IEnumerable)o) { list.Add(item.ToErlObject()); } return(list); } else { throw new ErlException(StringConsts.ERL_CANNOT_CONVERT_TYPES_ERROR, o.GetType().FullName, typeof(IErlObject).Name); } }