public YdlArgumentSerializer() : base() { // Register translator for the ByteSize struct, outputs the total bytes. ValueTranslators.Add(typeof(ByteSize), (a, t, v) => { double bytes = ((ByteSize)v).Bytes; return(bytes == 0 ? "0" : bytes.ToString("#.#")); }); }
public YoutubeDLApi(string executable, YoutubeDLArguments arguments = null) : base(executable, arguments) { ValueTranslators.Add(typeof(DateTime), (a, t, v) => { return(((DateTime)v).ToString("yyyyMMdd")); }); ValueTranslators.Add(typeof(ByteSize), (a, t, v) => { return(((ByteSize)v).Bytes.ToString("#.#")); }); AppendCheckers.Add(typeof(Dictionary <string, string>), (a, t, v) => { return(((Dictionary <string, string>)v).Count > 0); }); }
public virtual string TranslateFlagValue(Argument argument, Type type, object value) { if (value == null) { return(string.Empty); } Type typeKey = type.IsEnum ? typeof(Enum) : type; if (ValueTranslators.TryGetValue(typeKey, out Func <Argument, Type, object, string> translator)) { return(translator(argument, type, value)); } return(value.ToString()); }
protected void SetDefaults(bool clear = true) { if (clear) { ValueTranslators.Clear(); Builders.Clear(); AppendCheckers.Clear(); PreAppendChecker = null; } // Translates string properties to string... duh! ValueTranslators.Add(typeof(string), (a, t, v) => v.ToString()); // Translates enum properties to string by using the name representing the enum value. ValueTranslators.Add(typeof(Enum), (a, t, v) => { string name = Enum.GetName(t, v); return(a.EnumCase == EnumCasePolicy.LOWERCASE ? name.ToLower() : a.EnumCase == EnumCasePolicy.UPPERCASE ? name.ToUpper() : name); }); // Only append flag if value isn't null. This is checked before any other registered append checkers. PreAppendChecker = (a, t, v) => v != null; // Only append boolean flags if the value is true. AppendCheckers.Add(typeof(bool), (a, t, v) => (bool)v); // Add bool flags if value isnt false. // Custom builder for string -> string dictionaries repeatedly adds flag with key-value pair seperated by colon. Builders.Add(typeof(Dictionary <string, string>), (a, t, v) => { string builtFlag = string.Empty; int count = 0; Dictionary <string, string> dic = (Dictionary <string, string>)v; foreach (KeyValuePair <string, string> entry in dic) { string value = string.Format("{0}:{1}", entry.Key, entry.Value); value = QuoteFlagValue(a.QuotePolicy, value); builtFlag += string.Format("{0}{1} ", (dic.Count > 1 && count > 0) ? (a.Flag + " ") : string.Empty, value); count++; } if (dic.Count > 0) { builtFlag = builtFlag.Remove(builtFlag.Length - 1, 1); } return(a.Template.Replace("{flag}", a.Flag).Replace("{value}", builtFlag)); }); }
/// <summary> /// Sets this <see cref="CommandLineBuilder"/> to its default settings. /// </summary> public virtual void SetDefaults() { ValueTranslators.Clear(); Builders.Clear(); SerializationCheckers.Clear(); ArgumentSeperator = " "; Seperator = " "; // Only serialize flag if value isn't null. This is called before any other registered serialization checkers. CommonSerializationChecker = (a, t, v) => v != null; // Only serialize boolean flags if the value is true. SerializationCheckers.Add(typeof(bool), (a, t, v) => (bool)v); // Serialize boolean flags if value isn't false. // Only serialize dictionaries if they contain items. SerializationCheckers.Add(typeof(Dictionary <string, string>), (a, t, v) => ((Dictionary <string, string>)v).Count > 0); // Translates string properties to string... duh! ValueTranslators.Add(typeof(string), (a, t, v) => v.ToString()); // Translate DateTime objects to the format of "yyyyMMdd". ValueTranslators.Add(typeof(DateTime), (a, t, v) => ((DateTime)v).ToString("yyyyMMdd")); // Translates enum properties to string by using the name representing the enum value. ValueTranslators.Add(typeof(Enum), (a, t, v) => { string name = Enum.GetName(t, v); switch (a.EnumCase) { case EnumCasePolicy.Lowercase: return(name.ToLower()); case EnumCasePolicy.Uppercase: return(name.ToUpper()); case EnumCasePolicy.Default: default: return(name); } }); // Custom builder for string -> string dictionaries repeatedly adds flag with key-value pair seperated by colon. Builders.Add(typeof(Dictionary <string, string>), (argument, type, value) => { Dictionary <string, string> dictionary = (Dictionary <string, string>)value; if (dictionary.Count == 0) { return(null); // Returning null for a builder, or value translator ignores this argument. } StringBuilder sb = new StringBuilder(); foreach (KeyValuePair <string, string> entry in dictionary) { sb.Append(BuildFlag(argument, string.Format("{0}:{1}", entry.Key, entry.Value))).Append(ArgumentSeperator); } if (dictionary.Count > 1) { sb.Remove(sb.Length - ArgumentSeperator.Length, ArgumentSeperator.Length); } return(sb.ToString()); }); }