命令列分析元件IKende.CLI

smark發表於2014-02-12

        IKende.CLI是一款開源的命令列分解元件,它可以簡地把命令列字元轉換成命令物件。在編寫CLI應用的時候經常要對命令字元進行繁鎖的分解和轉換工作,而IKende.CLI的存也是為了解決以上問題而產生;通過特性的描述來簡化命令分析工作,從而讓在編寫CLI的時候制定命令變得更方便簡單。下面簡單地講解元件的使用

元件結構

     在使用前先了解一下元件的結構

        Parse是元件的切入點,也是使用的主要物件。他依據兩個物件來對資料進行分析處理分別是ILineAnalyzer和CommandBuilder.

ILineAnalyzer

        介面主要描述對命令列字元進行分析並返回一個統一的資料結構,元件提供一個預設實現;由於使用習慣的問題也可以制其他命令分解方式。

CommandBuilder 

        物件的主要作用是根據ILineAnalyzer結構繫結到物件中,通過CommandAttribute和ArgumentAttribute兩個特性來描述物件及其屬性和命令字元的對應關係。整個元件的設計都比較簡單,還有兩個介面ICommand和IConvert就不作詳細介紹了分別的命令定義規則和引數轉換規則的定義。

定義命令物件

        元件預設分析器命令屬性是以[-字母]來描述一個命令屬性,然後空格跟隨就是屬性的內容如:

login -h host -p port -u userName -w password

        以上是一個簡單地登陸指令,分別有主機名,埠,使用者名稱和密碼等資訊。針對以上字元命令制定的命令物件如下:

[Command("login")]
    public class Login : CommandBase
    {
        [Argument("h", "-h Host", Regex = @"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)+([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$")]
        public string Host
        {
            get;
            set;
        }
        [Argument("p", "-p Port", DefaultValue = "8088", Regex = @"^\d{4,5}$")]
        public int Port
        {
            get;
            set;
        }
        [Argument("u", "-u userName")]
        public string UserName
        {
            get;
            set;
        }
        [Argument("w", "-w passWord")]
        public string Pwd
        {
            get;
            set;
        }
    }

        由於有些屬性的資料是規範的,所以可以通過Argument特性的Regex屬性來制定一個資料約束規範;特性同樣也提供DefaultValue來描述一個屬性的預設值,如果在編寫命令時沒有指定該屬性值則使用預設值。

使用

命令定義好後只需要使用Parse物件對輸入的字元命令分析即可。

Parse<LineAnalyzer> mParse = new Parse<LineAnalyzer>();
mParse.LoadAssembly(typeof(Login).Assembly);//or mParse.Load<Login>();
string line="login -h www.ikende.com -u henry -w 123456";
ParseResult presult = mParse.Execute(line);
if (string.IsNullOrEmpty(presult.Error))
{
    //presult.Command
}

        在定義Parse物件的時候而要指定LineAnalyzer分析器,分析器型別的指定則根據實際應用的需求。Parse定義完成後需要載入相應的命令資訊,類提供了兩個方法Load和LoadAssembly分別用於載入單個物件或某程式集下面的所有命令物件。最後通過執行Execute方法得到具體ParseRresult物件,在分析過程有可能存在邏輯上的錯誤,通過ParseResult.Error屬性可以得到具體邏輯錯誤資訊。

應用效果

元件專案地址

         https://github.com/IKende/IKendeCLI

相關文章