Summary
};
use core::errors::{CargoResult,CargoError,ToResult,PathError};
+use serialize::{Encoder,Encodable};
// #[deriving(Decodable,Encodable,Eq,Clone)]
#[deriving(Eq,Clone)]
}
}
-#[deriving(Show,Clone,Eq)]
+#[deriving(Eq,Clone,Encodable)]
+pub struct SerializedManifest {
+ summary: Summary,
+ authors: Vec<~str>,
+ targets: Vec<Target>,
+ target_dir: ~str
+}
+
+impl<E, S: Encoder<E>> Encodable<S, E> for Manifest {
+ fn encode(&self, s: &mut S) -> Result<(), E> {
+ SerializedManifest {
+ summary: self.summary.clone(),
+ authors: self.authors.clone(),
+ targets: self.targets.clone(),
+ target_dir: self.target_dir.as_str().unwrap().to_owned()
+ }.encode(s)
+ }
+}
+
+#[deriving(Show,Clone,Eq,Encodable)]
pub enum TargetKind {
LibTarget,
BinTarget
path: Path
}
+#[deriving(Encodable)]
+pub struct SerializedTarget {
+ kind: &'static str,
+ name: ~str,
+ path: ~str
+}
+
+impl<E, S: Encoder<E>> Encodable<S, E> for Target {
+ fn encode(&self, s: &mut S) -> Result<(), E> {
+ let kind = match self.kind {
+ LibTarget => "lib",
+ BinTarget => "bin"
+ };
+
+ SerializedTarget {
+ kind: kind,
+ name: self.name.clone(),
+ path: self.path.as_str().unwrap().to_owned()
+ }.encode(s)
+ }
+}
+
impl Show for Target {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f.buf, "{}(name={}, path={})", self.kind, self.name, self.path.display())
self.get_summary().get_name_ver().get_name()
}
+ pub fn get_authors<'a>(&'a self) -> &'a [~str] {
+ self.authors.as_slice()
+ }
+
pub fn get_dependencies<'a>(&'a self) -> &'a [Dependency] {
self.get_summary().get_dependencies()
}
*
*/
-type SerializedLibTarget = SerializedTarget;
-type SerializedExecTarget = SerializedTarget;
+type TomlLibTarget = TomlTarget;
+type TomlExecTarget = TomlTarget;
#[deriving(Decodable,Encodable,Eq,Clone,Show)]
pub struct Project {
*/
#[deriving(Decodable,Encodable,Eq,Clone)]
-pub struct SerializedManifest {
+pub struct TomlManifest {
project: ~Project,
- lib: Option<~[SerializedLibTarget]>,
- bin: Option<~[SerializedExecTarget]>,
+ lib: Option<~[TomlLibTarget]>,
+ bin: Option<~[TomlExecTarget]>,
dependencies: Option<HashMap<~str, ~str>>
}
-impl SerializedManifest {
+impl TomlManifest {
pub fn to_package(&self, path: &str) -> CargoResult<Package> {
// Get targets
let targets = normalize(&self.lib, &self.bin);
}
#[deriving(Decodable,Encodable,Eq,Clone)]
-struct SerializedTarget {
+struct TomlTarget {
name: ~str,
path: Option<~str>
}
-fn normalize(lib: &Option<~[SerializedLibTarget]>, bin: &Option<~[SerializedExecTarget]>) -> Vec<Target> {
- fn lib_targets(dst: &mut Vec<Target>, libs: &[SerializedLibTarget]) {
+fn normalize(lib: &Option<~[TomlLibTarget]>, bin: &Option<~[TomlExecTarget]>) -> Vec<Target> {
+ fn lib_targets(dst: &mut Vec<Target>, libs: &[TomlLibTarget]) {
let l = &libs[0];
let path = l.path.clone().unwrap_or_else(|| format!("src/{}.rs", l.name));
dst.push(Target::lib_target(l.name, &Path::new(path)));
}
- fn bin_targets(dst: &mut Vec<Target>, bins: &[SerializedExecTarget], default: |&SerializedExecTarget| -> ~str) {
+ fn bin_targets(dst: &mut Vec<Target>, bins: &[TomlExecTarget], default: |&TomlExecTarget| -> ~str) {
for bin in bins.iter() {
let path = bin.path.clone().unwrap_or_else(|| default(bin));
dst.push(Target::bin_target(bin.name.clone(), &Path::new(path)));
Summary
};
use util::graph;
+use serialize::{Encoder,Encodable};
-#[deriving(Clone)]
+#[deriving(Clone,Eq)]
pub struct Package {
// The package's manifest
manifest: Manifest,
root: Path,
}
+#[deriving(Encodable)]
+struct SerializedPackage {
+ name: ~str,
+ version: ~str,
+ dependencies: Vec<Dependency>,
+ authors: Vec<~str>,
+ targets: Vec<Target>,
+ root: ~str
+}
+
+impl<E, S: Encoder<E>> Encodable<S, E> for Package {
+ fn encode(&self, s: &mut S) -> Result<(), E> {
+ let manifest = self.get_manifest();
+ let summary = manifest.get_summary();
+ let name_ver = summary.get_name_ver();
+
+ SerializedPackage {
+ name: name_ver.get_name().to_owned(),
+ version: name_ver.get_version().to_str(),
+ dependencies: Vec::from_slice(summary.get_dependencies()),
+ authors: Vec::from_slice(manifest.get_authors()),
+ targets: Vec::from_slice(manifest.get_targets()),
+ root: self.root.as_str().unwrap().to_owned()
+ }.encode(s)
+ }
+}
+
impl Package {
pub fn new(manifest: &Manifest, root: &Path) -> Package {
Package {