Advertisement
Guest User

Untitled

a guest
Feb 27th, 2014
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 4.50 KB | None | 0 0
  1. namespace Circuit
  2.  
  3. open System
  4. open System.Xml
  5. open UnityEngine
  6. open Utils
  7.  
  8. module Serializer =
  9.  
  10.   type private doc = XmlDocument
  11.   type private node = XmlNode
  12.  
  13.   let private parent (n:node) = n.ParentNode
  14.   let private makeTag (doc:doc) (name:string) = doc.CreateElement(name)
  15.   let private makeChild (doc:doc) (name:string) (n:node) = n.AppendChild(doc.CreateElement(name))
  16.  
  17.   let private makeAttr (doc:doc) (name:string) (value:obj) (n:node) =
  18.     let attr = doc.CreateAttribute(name)
  19.     attr.Value <- value.ToString()
  20.     n.Attributes.Append(attr) |> ignore
  21.     n
  22.    
  23.   let private makeChildren lst f (n:node) =
  24.     for item in lst do
  25.       n.AppendChild(f item) |> ignore
  26.     n
  27.    
  28.   let private serializeSlot tag (attr : string -> obj -> node -> node) (s:Slot) =  
  29.     tag (if s.Mode = SlotMode.In then "SlotIn" else "SlotOut")
  30.     |> attr "Id" s.Id
  31.     |> attr "TypeId" s.TypeId
  32.     |> attr "Name" s.Name
  33.     |> attr "Mode" (SlotMode.GetName s.Mode)
  34.  
  35.   let private doc2str (doc:doc) =
  36.     let sb = new Text.StringBuilder(2048)
  37.     let xws = new System.Xml.XmlWriterSettings();
  38.     xws.Indent <- true
  39.     xws.IndentChars <- "  "
  40.    
  41.     use sw = new System.IO.StringWriter(sb)
  42.     use xw = System.Xml.XmlWriter.Create(sw, xws)
  43.  
  44.     doc.WriteTo(xw)
  45.  
  46.     xw.Flush()
  47.     sw.Flush()
  48.     sb.ToString()
  49.  
  50.   let ContextSerialize (x:Context) =
  51.     let doc = new doc();
  52.     let tag = makeTag doc
  53.     let attr : string -> obj -> node -> node = makeAttr doc
  54.     let child = makeChild doc
  55.     let children = makeChildren
  56.  
  57.     tag "Context"
  58.       |> attr "Id" x.Id
  59.       |> attr "Name" x.Name
  60.       |> child "DataTypeList"
  61.         |> children x.DataTypes (fun kvp ->
  62.           let dt = kvp.Value
  63.           tag "DataType"
  64.             |> attr "Id" dt.Id
  65.             |> attr "Name" dt.Name
  66.             |> attr "Color" (clr2str dt.Color))
  67.         |> parent
  68.       |> child "NodeTypeList"
  69.         |> children x.NodeTypes (fun kvp ->
  70.           let nt = kvp.Value
  71.           tag "NodeType"
  72.             |> attr "Id" nt.Id
  73.             |> attr "Name" nt.Name
  74.             |> attr "Color" (clr2str nt.Color)
  75.             |> children nt.SlotsIn (serializeSlot tag attr)
  76.             |> children nt.SlotsOut (serializeSlot tag attr))
  77.         |> parent
  78.       |> child "LinkTypeList"
  79.         |> children x.LinkTypes (fun kvp ->
  80.           let lt = kvp.Value
  81.           tag "LinkType"
  82.             |> attr "Id" lt.Id
  83.             |> attr "Name" lt.Name
  84.             |> attr "Color" (clr2str lt.Color))
  85.       |> parent
  86.       |> doc.AppendChild
  87.       |> ignore
  88.        
  89.     // output document as string
  90.     doc2str doc
  91.  
  92.   let ContextDeserialize (str:string) =
  93.     let doc = new doc()
  94.     doc.LoadXml str
  95.    
  96.     let parseGuid (n:node) (attr:string) = new Guid(n.Attributes.[attr].Value)
  97.     let parseId (n:node) = parseGuid n "Id"
  98.     let parseName (n:node) = n.Attributes.["Name"].Value
  99.     let parseColor (n:node) = str2clr n.Attributes.["Color"].Value
  100.  
  101.     let cc =
  102.       doc.SelectSingleNode "/Context"
  103.         |> (fun n -> new ContextCreator(parseId n, parseName n))
  104.  
  105.     doc.SelectNodes "/Context/DataTypeList/DataType"
  106.       |> Seq.cast<node>
  107.       |> Seq.iter (fun n -> cc.CreateDataType(parseId n, parseName n, parseColor n) |> ignore)
  108.  
  109.     doc.SelectNodes "/Context/NodeTypeList/NodeType"
  110.       |> Seq.cast<node>
  111.       |> Seq.iter (fun n ->
  112.         let nt = cc.CreateNodeType(parseId n, parseName n, parseColor n)
  113.  
  114.         let parseSlot (n:node) =
  115.           let mode = SlotMode.GetValue n.Attributes.["Mode"].Value
  116.           let dt = cc.Context.FindDataType(parseGuid n "TypeId")
  117.           cc.CreateNodeTypeSlot(nt, parseId n, dt, parseName n, mode)
  118.  
  119.         n.SelectNodes("SlotIn")
  120.          |> Seq.cast<node>
  121.          |> Seq.reverse
  122.          |> Seq.iter parseSlot
  123.  
  124.         n.SelectNodes("SlotOut")
  125.          |> Seq.cast<node>
  126.          |> Seq.reverse
  127.          |> Seq.iter parseSlot
  128.       )
  129.  
  130.     doc.SelectNodes "/Context/LinkTypeList/LinkType"
  131.       |> Seq.cast<node>
  132.       |> Seq.iter (fun n -> cc.CreateLinkType(parseId n, parseName n, parseColor n) |> ignore)
  133.  
  134.     cc
  135.    
  136.   let CanvasSerialize (x:Canvas) =
  137.     let doc = new doc();
  138.     let tag = makeTag doc
  139.     let attr : string -> obj -> node -> node = makeAttr doc
  140.     let child = makeChild doc
  141.     let children = makeChildren
  142.  
  143.     tag "Canvas"
  144.       |> attr "Id" x.Id
  145.       |> attr "Name" x.Name
  146.       |> attr "ContextId" x.Context.Id
  147.       |> doc.AppendChild
  148.       |> ignore
  149.  
  150.     // write document
  151.     doc2str doc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement