private object ConvertType00(object o, Type type) { if (type == typeof(TimeSpan)) { double seconds; if (double.TryParse("" + o, out seconds)) { return(TimeSpan.FromSeconds(seconds)); } } if (FilterSpecAttribute.IsAssignableFrom(typeof(SimObject), type)) { return(AsSimObject(o)); } if (FilterSpecAttribute.IsAssignableFrom(typeof(Primitive), type)) { return(AsSimObject(o).Prim); } if (FilterSpecAttribute.IsAssignableFrom(typeof(UUID), type)) { SimObject nullCheck = AsSimObject(o); if (nullCheck == null) { return(null); } return(nullCheck.ID); } if (o is IConvertible) { if (typeof(IConvertible).IsAssignableFrom(type)) { try { return(Convert.ChangeType(o, type)); } catch { } } } return(ConfigSettingAttribute.FindValueOfType(o, type, 2)); }
public IEnumerable <FilterMember> GetFilters(Type type) { return(FilterSpecAttribute.GetFilters(type)); }
public List <SimObject> GetUnionArg(string[] args, out int argsUsed, List <SimObject> prims, ref bool isIntersection, bool negated, MixinSubObjects relativeTo, out bool negateNext) { string arg0Lower = args[0].ToLower(); negateNext = false; if (arg0Lower == "!") { negateNext = true; argsUsed = 1; return(prims); } int used = 0; // Negation if (arg0Lower == "not") { prims = GetUnionExprsn(Parser.SplitOff(args, 1), out used, prims, !negated, relativeTo); argsUsed = 1 + used; return(prims); } else if (arg0Lower == "or" || arg0Lower == "concat") { var secondSet = StartGetUnionExprsn(Parser.SplitOff(args, 1), out used); prims.AddRange(secondSet); argsUsed = used; return(prims); } if (arg0Lower == "[") { var secondSet = StartGetUnionExprsn(Parser.SplitOff(args, 1), out used); argsUsed = 1 + used; return(JoinLists(prims, negated, isIntersection, secondSet)); } if (arg0Lower == "+") { var secondSet = GetSingleArg(Parser.SplitOff(args, 1), out used); argsUsed = 1 + used; return(JoinLists(prims, negated, false, secondSet)); } if (arg0Lower == "keep" || arg0Lower == "max") { int nth; used++; if (int.TryParse(args[1], out nth)) { used++; } int keep = Math.Abs(nth); if (keep > prims.Count) { keep = prims.Count; } if (negated) { keep = prims.Count - keep; } int removeCount = prims.Count - keep; if (nth > 0) { // keep the first few prims.RemoveRange(keep, removeCount); } else { // keep the last few prims.RemoveRange(0, removeCount); } argsUsed = used; return(prims); } else if (arg0Lower == "nth") { used++; int nth = 0; if (int.TryParse(args[1], out nth)) { used++; } if (!negated) { List <SimObject> prims0 = new List <SimObject>(); if (prims.Count >= nth) { prims0.Add(prims[nth - 1]); } prims = prims0; } else { prims = new List <SimObject>(prims); prims.RemoveAt(nth); } argsUsed = used; return(prims); } else if (arg0Lower == "bydist") { used++; List <SimObject> objs = new List <SimObject>(); AsPrimitives(objs, prims); objs.Sort(((SimObject)relativeTo).CompareDistance); if (negated) { objs.Reverse(); } prims = objs; argsUsed = used; return(prims); } else if (arg0Lower == "distfrom") { relativeTo = GetSimObjectS(Parser.SplitOff(args, 1), out used); used++; List <SimObject> objs = new List <SimObject>(); AsPrimitives(objs, prims); objs.Sort(((SimObject)relativeTo).CompareDistance); if (negated) { objs.Reverse(); } prims = objs; argsUsed = used; return(prims); } else if (arg0Lower == "reverse") { used++; prims.Reverse(); argsUsed = used; return(prims); } else { bool nonFilter = arg0Lower.StartsWith("$") || arg0Lower.StartsWith("@") || arg0Lower.StartsWith("primid") || arg0Lower.Substring(1).Contains("-"); ParserFilterFormatException missingFilter = null; if (!nonFilter) { // filters will re-namgate so use the incoming "removeMatches" int usedF; try { return(FilterSpecAttribute.ApplyFilter(args, out argsUsed, ChangeType, prims, relativeTo, negated, Debug, CompareObjectsChar)); } catch (ParserFilterFormatException pff) { missingFilter = pff; } } List <SimObject> rcol = GetSingleArg(args, out argsUsed); if (rcol != null) { return(JoinLists(prims, negated, isIntersection, rcol)); } else { if (missingFilter != null) { argsUsed = 0; // what saort of erro should we make? Debug("no such filter or object: " + arg0Lower); throw missingFilter; } } } return(prims); }