/// <summary> /// Parses this command into a processor given the arguments for this switch. Consumes the previous processors and returns how many it consumes. /// </summary> public override int Parse(List <Processor> previous, out Processor processor) { if (this.Arguments.Length != 1) { throw new ArgumentException("Exactly one argument is expected."); } if (previous.Count < 1) { throw new ArgumentException("Expected at least one processors before this one."); } var file = new FileInfo(this.Arguments[0]); if (!(previous[previous.Count - 1] is Processors.MultimodalDb.IProcessorMultimodalDbSource)) { throw new Exception("Expected a multimodal db source."); } var source = (previous[previous.Count - 1] as Processors.MultimodalDb.IProcessorMultimodalDbSource); Func <Itinero.Transit.Data.MultimodalDb> getMultimodalDb = () => { var multimodalDb = source.GetMultimodalDb(); using (var stream = File.Open(file.FullName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { multimodalDb.Serialize(stream); } return(multimodalDb); }; processor = new Processors.MultimodalDb.ProcessorMultimodalDbSource(getMultimodalDb); return(1); }
/// <summary> /// Parses this command into a processor given the arguments for this switch. Consumes the previous processors and returns how many it consumes. /// </summary> public override int Parse(List <Processor> previous, out Processor processor) { var profileName = string.Empty; // no default profile. var distance = 100; // default distance 100m. for (var i = 0; i < this.Arguments.Length; i++) { string key, value; if (SwitchParsers.SplitKeyValue(this.Arguments[i], out key, out value)) { switch (key.ToLower()) { case "profile": profileName = value; break; case "distance": if (!int.TryParse(value, out distance)) { throw new SwitchParserException("--add-links", "Invalid parameter value for command --add-links: distance not a number."); } break; default: throw new SwitchParserException("--add-links", string.Format("Invalid parameter for command --add-links: {0} not recognized.", key)); } } } Profile profile; if (!Profile.TryGet(profileName, out profile)) { throw new SwitchParserException("--add-links", string.Format("Invalid parameter value for command --add-links: profile {0} not found.", profileName)); } if (!(previous[previous.Count - 1] is Processors.MultimodalDb.IProcessorMultimodalDbSource)) { throw new Exception("Expected a multimodal db stream source."); } var source = (previous[previous.Count - 1] as Processors.MultimodalDb.IProcessorMultimodalDbSource).GetMultimodalDb; Func <Itinero.Transit.Data.MultimodalDb> getMultimodalDb = () => { var db = source(); db.AddStopLinksDb(profile, maxDistance: distance); return(db); }; processor = new Processors.MultimodalDb.ProcessorMultimodalDbSource(getMultimodalDb); return(1); }
/// <summary> /// Parses this command into a processor given the arguments for this switch. Consumes the previous processors and returns how many it consumes. /// </summary> public override int Parse(List <Processor> previous, out Processor processor) { if (previous == null || previous.Count == 0) { throw new ArgumentOutOfRangeException("processors"); } // ok combine the transit db and the router db into one multimodal db. Func <Itinero.Transit.Data.TransitDb> getTransitDb; Func <Itinero.RouterDb> getRouterDb; if (previous[previous.Count - 2] is IProcessorTransitDbSource && previous[previous.Count - 1] is IProcessorRouterDbSource) { getTransitDb = (previous[previous.Count - 2] as IProcessorTransitDbSource).GetTransitDb; getRouterDb = (previous[previous.Count - 1] as IProcessorRouterDbSource).GetRouterDb; } else if (previous[previous.Count - 1] is IProcessorTransitDbSource && previous[previous.Count - 2] is IProcessorRouterDbSource) { getTransitDb = (previous[previous.Count - 1] as IProcessorTransitDbSource).GetTransitDb; getRouterDb = (previous[previous.Count - 2] as IProcessorRouterDbSource).GetRouterDb; } else { throw new Exception("Creating a multimodal requires a transit db an a router db source."); } previous.RemoveAt(previous.Count - 1); previous.RemoveAt(previous.Count - 2); processor = new Processors.MultimodalDb.ProcessorMultimodalDbSource(() => { var transitDb = getTransitDb(); var routerDb = getRouterDb(); return(new Itinero.Transit.Data.MultimodalDb(routerDb, transitDb)); }); return(2); }