Hex Artifact Content
Not logged in

Artifact 201f598b88410f4e39a8499cccee2f9bd21290a8:


0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 35 20 4d 61 69 64 53 61 66 65 2e 6e 65 74 20 6c  5 MaidSafe.net l
0020: 69 6d 69 74 65 64 2e 0a 2f 2f 0a 2f 2f 20 54 68  imited..//.// Th
0030: 69 73 20 53 41 46 45 20 4e 65 74 77 6f 72 6b 20  is SAFE Network 
0040: 53 6f 66 74 77 61 72 65 20 69 73 20 6c 69 63 65  Software is lice
0050: 6e 73 65 64 20 74 6f 20 79 6f 75 20 75 6e 64 65  nsed to you unde
0060: 72 20 28 31 29 20 74 68 65 20 4d 61 69 64 53 61  r (1) the MaidSa
0070: 66 65 2e 6e 65 74 20 43 6f 6d 6d 65 72 63 69 61  fe.net Commercia
0080: 6c 20 4c 69 63 65 6e 73 65 2c 0a 2f 2f 20 76 65  l License,.// ve
0090: 72 73 69 6f 6e 20 31 2e 30 20 6f 72 20 6c 61 74  rsion 1.0 or lat
00a0: 65 72 2c 20 6f 72 20 28 32 29 20 54 68 65 20 47  er, or (2) The G
00b0: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
00c0: 63 65 6e 73 65 20 28 47 50 4c 29 2c 20 76 65 72  cense (GPL), ver
00d0: 73 69 6f 6e 20 33 2c 20 64 65 70 65 6e 64 69 6e  sion 3, dependin
00e0: 67 20 6f 6e 20 77 68 69 63 68 0a 2f 2f 20 6c 69  g on which.// li
00f0: 63 65 6e 63 65 20 79 6f 75 20 61 63 63 65 70 74  cence you accept
0100: 65 64 20 6f 6e 20 69 6e 69 74 69 61 6c 20 61 63  ed on initial ac
0110: 63 65 73 73 20 74 6f 20 74 68 65 20 53 6f 66 74  cess to the Soft
0120: 77 61 72 65 20 28 74 68 65 20 22 4c 69 63 65 6e  ware (the "Licen
0130: 63 65 73 22 29 2e 0a 2f 2f 0a 2f 2f 20 42 79 20  ces")..//.// By 
0140: 63 6f 6e 74 72 69 62 75 74 69 6e 67 20 63 6f 64  contributing cod
0150: 65 20 74 6f 20 74 68 65 20 53 41 46 45 20 4e 65  e to the SAFE Ne
0160: 74 77 6f 72 6b 20 53 6f 66 74 77 61 72 65 2c 20  twork Software, 
0170: 6f 72 20 74 6f 20 74 68 69 73 20 70 72 6f 6a 65  or to this proje
0180: 63 74 20 67 65 6e 65 72 61 6c 6c 79 2c 20 79 6f  ct generally, yo
0190: 75 20 61 67 72 65 65 20 74 6f 20 62 65 0a 2f 2f  u agree to be.//
01a0: 20 62 6f 75 6e 64 20 62 79 20 74 68 65 20 74 65   bound by the te
01b0: 72 6d 73 20 6f 66 20 74 68 65 20 4d 61 69 64 53  rms of the MaidS
01c0: 61 66 65 20 43 6f 6e 74 72 69 62 75 74 6f 72 20  afe Contributor 
01d0: 41 67 72 65 65 6d 65 6e 74 2c 20 76 65 72 73 69  Agreement, versi
01e0: 6f 6e 20 31 2e 30 2e 20 20 54 68 69 73 2c 20 61  on 1.0.  This, a
01f0: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 2f 2f  long with the.//
0200: 20 4c 69 63 65 6e 73 65 73 20 63 61 6e 20 62 65   Licenses can be
0210: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 72 6f   found in the ro
0220: 6f 74 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  ot directory of 
0230: 74 68 69 73 20 70 72 6f 6a 65 63 74 20 61 74 20  this project at 
0240: 4c 49 43 45 4e 53 45 2c 20 43 4f 50 59 49 4e 47  LICENSE, COPYING
0250: 20 61 6e 64 20 43 4f 4e 54 52 49 42 55 54 4f 52   and CONTRIBUTOR
0260: 2e 0a 2f 2f 0a 2f 2f 20 55 6e 6c 65 73 73 20 72  ..//.// Unless r
0270: 65 71 75 69 72 65 64 20 62 79 20 61 70 70 6c 69  equired by appli
0280: 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61 67 72  cable law or agr
0290: 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74 69 6e  eed to in writin
02a0: 67 2c 20 74 68 65 20 53 41 46 45 20 4e 65 74 77  g, the SAFE Netw
02b0: 6f 72 6b 20 53 6f 66 74 77 61 72 65 20 64 69 73  ork Software dis
02c0: 74 72 69 62 75 74 65 64 0a 2f 2f 20 75 6e 64 65  tributed.// unde
02d0: 72 20 74 68 65 20 47 50 4c 20 4c 69 63 65 6e 63  r the GPL Licenc
02e0: 65 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  e is distributed
02f0: 20 6f 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42   on an "AS IS" B
0300: 41 53 49 53 2c 20 57 49 54 48 4f 55 54 20 57 41  ASIS, WITHOUT WA
0310: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
0320: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 0a 2f 2f  ITIONS OF ANY.//
0330: 20 4b 49 4e 44 2c 20 65 69 74 68 65 72 20 65 78   KIND, either ex
0340: 70 72 65 73 73 20 6f 72 20 69 6d 70 6c 69 65 64  press or implied
0350: 2e 0a 2f 2f 0a 2f 2f 20 50 6c 65 61 73 65 20 72  ..//.// Please r
0360: 65 76 69 65 77 20 74 68 65 20 4c 69 63 65 6e 63  eview the Licenc
0370: 65 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  es for the speci
0380: 66 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76  fic language gov
0390: 65 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f  erning permissio
03a0: 6e 73 20 61 6e 64 20 6c 69 6d 69 74 61 74 69 6f  ns and limitatio
03b0: 6e 73 0a 2f 2f 20 72 65 6c 61 74 69 6e 67 20 74  ns.// relating t
03c0: 6f 20 75 73 65 20 6f 66 20 74 68 65 20 53 41 46  o use of the SAF
03d0: 45 20 4e 65 74 77 6f 72 6b 20 53 6f 66 74 77 61  E Network Softwa
03e0: 72 65 2e 0a 0a 2f 2f 21 20 52 45 53 54 20 41 50  re...//! REST AP
03f0: 49 20 65 78 61 6d 70 6c 65 2e 0a 0a 2f 2f 20 46  I example...// F
0400: 6f 72 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  or explanation o
0410: 66 20 6c 69 6e 74 20 63 68 65 63 6b 73 2c 20 72  f lint checks, r
0420: 75 6e 20 60 72 75 73 74 63 20 2d 57 20 68 65 6c  un `rustc -W hel
0430: 70 60 20 6f 72 20 73 65 65 0a 2f 2f 20 68 74 74  p` or see.// htt
0440: 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f  ps://github.com/
0450: 6d 61 69 64 73 61 66 65 2f 51 41 2f 62 6c 6f 62  maidsafe/QA/blob
0460: 2f 6d 61 73 74 65 72 2f 44 6f 63 75 6d 65 6e 74  /master/Document
0470: 61 74 69 6f 6e 2f 52 75 73 74 25 32 30 4c 69 6e  ation/Rust%20Lin
0480: 74 25 32 30 43 68 65 63 6b 73 2e 6d 64 0a 23 21  t%20Checks.md.#!
0490: 5b 66 6f 72 62 69 64 28 62 61 64 5f 73 74 79 6c  [forbid(bad_styl
04a0: 65 2c 20 65 78 63 65 65 64 69 6e 67 5f 62 69 74  e, exceeding_bit
04b0: 73 68 69 66 74 73 2c 20 6d 75 74 61 62 6c 65 5f  shifts, mutable_
04c0: 74 72 61 6e 73 6d 75 74 65 73 2c 20 6e 6f 5f 6d  transmutes, no_m
04d0: 61 6e 67 6c 65 5f 63 6f 6e 73 74 5f 69 74 65 6d  angle_const_item
04e0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6b  s,.          unk
04f0: 6e 6f 77 6e 5f 63 72 61 74 65 5f 74 79 70 65 73  nown_crate_types
0500: 2c 20 77 61 72 6e 69 6e 67 73 29 5d 0a 23 21 5b  , warnings)].#![
0510: 64 65 6e 79 28 64 65 70 72 65 63 61 74 65 64 2c  deny(deprecated,
0520: 20 69 6d 70 72 6f 70 65 72 5f 63 74 79 70 65 73   improper_ctypes
0530: 2c 20 6d 69 73 73 69 6e 67 5f 64 6f 63 73 2c 0a  , missing_docs,.
0540: 20 20 20 20 20 20 20 20 6e 6f 6e 5f 73 68 6f 72          non_shor
0550: 74 68 61 6e 64 5f 66 69 65 6c 64 5f 70 61 74 74  thand_field_patt
0560: 65 72 6e 73 2c 20 6f 76 65 72 66 6c 6f 77 69 6e  erns, overflowin
0570: 67 5f 6c 69 74 65 72 61 6c 73 2c 20 70 6c 75 67  g_literals, plug
0580: 69 6e 5f 61 73 5f 6c 69 62 72 61 72 79 2c 0a 20  in_as_library,. 
0590: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 5f 6e         private_n
05a0: 6f 5f 6d 61 6e 67 6c 65 5f 66 6e 73 2c 20 70 72  o_mangle_fns, pr
05b0: 69 76 61 74 65 5f 6e 6f 5f 6d 61 6e 67 6c 65 5f  ivate_no_mangle_
05c0: 73 74 61 74 69 63 73 2c 20 73 74 61 62 6c 65 5f  statics, stable_
05d0: 66 65 61 74 75 72 65 73 2c 20 75 6e 63 6f 6e 64  features, uncond
05e0: 69 74 69 6f 6e 61 6c 5f 72 65 63 75 72 73 69 6f  itional_recursio
05f0: 6e 2c 0a 20 20 20 20 20 20 20 20 75 6e 6b 6e 6f  n,.        unkno
0600: 77 6e 5f 6c 69 6e 74 73 2c 20 75 6e 73 61 66 65  wn_lints, unsafe
0610: 5f 63 6f 64 65 2c 20 75 6e 75 73 65 64 2c 20 75  _code, unused, u
0620: 6e 75 73 65 64 5f 61 6c 6c 6f 63 61 74 69 6f 6e  nused_allocation
0630: 2c 20 75 6e 75 73 65 64 5f 61 74 74 72 69 62 75  , unused_attribu
0640: 74 65 73 2c 0a 20 20 20 20 20 20 20 20 75 6e 75  tes,.        unu
0650: 73 65 64 5f 63 6f 6d 70 61 72 69 73 6f 6e 73 2c  sed_comparisons,
0660: 20 75 6e 75 73 65 64 5f 66 65 61 74 75 72 65 73   unused_features
0670: 2c 20 75 6e 75 73 65 64 5f 70 61 72 65 6e 73 2c  , unused_parens,
0680: 20 77 68 69 6c 65 5f 74 72 75 65 29 5d 0a 23 21   while_true)].#!
0690: 5b 77 61 72 6e 28 74 72 69 76 69 61 6c 5f 63 61  [warn(trivial_ca
06a0: 73 74 73 2c 20 74 72 69 76 69 61 6c 5f 6e 75 6d  sts, trivial_num
06b0: 65 72 69 63 5f 63 61 73 74 73 2c 20 75 6e 75 73  eric_casts, unus
06c0: 65 64 5f 65 78 74 65 72 6e 5f 63 72 61 74 65 73  ed_extern_crates
06d0: 2c 20 75 6e 75 73 65 64 5f 69 6d 70 6f 72 74 5f  , unused_import_
06e0: 62 72 61 63 65 73 2c 0a 20 20 20 20 20 20 20 20  braces,.        
06f0: 75 6e 75 73 65 64 5f 71 75 61 6c 69 66 69 63 61  unused_qualifica
0700: 74 69 6f 6e 73 2c 20 75 6e 75 73 65 64 5f 72 65  tions, unused_re
0710: 73 75 6c 74 73 29 5d 0a 23 21 5b 61 6c 6c 6f 77  sults)].#![allow
0720: 28 62 6f 78 5f 70 6f 69 6e 74 65 72 73 2c 20 66  (box_pointers, f
0730: 61 74 5f 70 74 72 5f 74 72 61 6e 73 6d 75 74 65  at_ptr_transmute
0740: 73 2c 20 6d 69 73 73 69 6e 67 5f 63 6f 70 79 5f  s, missing_copy_
0750: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
0760: 0a 20 20 20 20 20 20 20 20 20 6d 69 73 73 69 6e  .         missin
0770: 67 5f 64 65 62 75 67 5f 69 6d 70 6c 65 6d 65 6e  g_debug_implemen
0780: 74 61 74 69 6f 6e 73 2c 20 76 61 72 69 61 6e 74  tations, variant
0790: 5f 73 69 7a 65 5f 64 69 66 66 65 72 65 6e 63 65  _size_difference
07a0: 73 29 5d 0a 0a 23 21 5b 63 66 67 5f 61 74 74 72  s)]..#![cfg_attr
07b0: 28 66 65 61 74 75 72 65 3d 22 63 6c 69 70 70 79  (feature="clippy
07c0: 22 2c 20 66 65 61 74 75 72 65 28 70 6c 75 67 69  ", feature(plugi
07d0: 6e 29 29 5d 0a 23 21 5b 63 66 67 5f 61 74 74 72  n))].#![cfg_attr
07e0: 28 66 65 61 74 75 72 65 3d 22 63 6c 69 70 70 79  (feature="clippy
07f0: 22 2c 20 70 6c 75 67 69 6e 28 63 6c 69 70 70 79  ", plugin(clippy
0800: 29 29 5d 0a 23 21 5b 63 66 67 5f 61 74 74 72 28  ))].#![cfg_attr(
0810: 66 65 61 74 75 72 65 3d 22 63 6c 69 70 70 79 22  feature="clippy"
0820: 2c 20 64 65 6e 79 28 63 6c 69 70 70 79 29 29 5d  , deny(clippy))]
0830: 0a 23 21 5b 63 66 67 5f 61 74 74 72 28 66 65 61  .#![cfg_attr(fea
0840: 74 75 72 65 3d 22 63 6c 69 70 70 79 22 2c 20 61  ture="clippy", a
0850: 6c 6c 6f 77 28 75 73 65 5f 64 65 62 75 67 2c 20  llow(use_debug, 
0860: 70 72 69 6e 74 5f 73 74 64 6f 75 74 29 29 5d 0a  print_stdout))].
0870: 0a 23 21 5b 61 6c 6c 6f 77 28 75 6e 75 73 65 64  .#![allow(unused
0880: 5f 65 78 74 65 72 6e 5f 63 72 61 74 65 73 29 5d  _extern_crates)]
0890: 23 5b 6d 61 63 72 6f 5f 75 73 65 5d 0a 65 78 74  #[macro_use].ext
08a0: 65 72 6e 20 63 72 61 74 65 20 6d 61 69 64 73 61  ern crate maidsa
08b0: 66 65 5f 75 74 69 6c 69 74 69 65 73 3b 0a 65 78  fe_utilities;.ex
08c0: 74 65 72 6e 20 63 72 61 74 65 20 74 69 6d 65 3b  tern crate time;
08d0: 0a 65 78 74 65 72 6e 20 63 72 61 74 65 20 72 6f  .extern crate ro
08e0: 75 74 69 6e 67 3b 0a 65 78 74 65 72 6e 20 63 72  uting;.extern cr
08f0: 61 74 65 20 73 61 66 65 5f 63 6f 72 65 3b 0a 23  ate safe_core;.#
0900: 5b 6d 61 63 72 6f 5f 75 73 65 5d 0a 65 78 74 65  [macro_use].exte
0910: 72 6e 20 63 72 61 74 65 20 75 6e 77 72 61 70 3b  rn crate unwrap;
0920: 0a 0a 0a 75 73 65 20 72 6f 75 74 69 6e 67 3a 3a  ...use routing::
0930: 58 4f 52 5f 4e 41 4d 45 5f 4c 45 4e 3b 0a 75 73  XOR_NAME_LEN;.us
0940: 65 20 73 61 66 65 5f 63 6f 72 65 3a 3a 63 6f 72  e safe_core::cor
0950: 65 3a 3a 63 6c 69 65 6e 74 3a 3a 43 6c 69 65 6e  e::client::Clien
0960: 74 3b 0a 75 73 65 20 73 61 66 65 5f 63 6f 72 65  t;.use safe_core
0970: 3a 3a 6e 66 73 3a 3a 7b 73 65 6c 66 2c 20 41 63  ::nfs::{self, Ac
0980: 63 65 73 73 4c 65 76 65 6c 7d 3b 0a 75 73 65 20  cessLevel};.use 
0990: 73 61 66 65 5f 63 6f 72 65 3a 3a 6e 66 73 3a 3a  safe_core::nfs::
09a0: 64 69 72 65 63 74 6f 72 79 5f 6c 69 73 74 69 6e  directory_listin
09b0: 67 3a 3a 44 69 72 65 63 74 6f 72 79 4c 69 73 74  g::DirectoryList
09c0: 69 6e 67 3b 0a 75 73 65 20 73 61 66 65 5f 63 6f  ing;.use safe_co
09d0: 72 65 3a 3a 6e 66 73 3a 3a 65 72 72 6f 72 73 3a  re::nfs::errors:
09e0: 3a 4e 66 73 45 72 72 6f 72 3b 0a 75 73 65 20 73  :NfsError;.use s
09f0: 61 66 65 5f 63 6f 72 65 3a 3a 6e 66 73 3a 3a 68  afe_core::nfs::h
0a00: 65 6c 70 65 72 3a 3a 64 69 72 65 63 74 6f 72 79  elper::directory
0a10: 5f 68 65 6c 70 65 72 3a 3a 44 69 72 65 63 74 6f  _helper::Directo
0a20: 72 79 48 65 6c 70 65 72 3b 0a 75 73 65 20 73 61  ryHelper;.use sa
0a30: 66 65 5f 63 6f 72 65 3a 3a 6e 66 73 3a 3a 68 65  fe_core::nfs::he
0a40: 6c 70 65 72 3a 3a 66 69 6c 65 5f 68 65 6c 70 65  lper::file_helpe
0a50: 72 3a 3a 46 69 6c 65 48 65 6c 70 65 72 3b 0a 75  r::FileHelper;.u
0a60: 73 65 20 73 61 66 65 5f 63 6f 72 65 3a 3a 6e 66  se safe_core::nf
0a70: 73 3a 3a 68 65 6c 70 65 72 3a 3a 77 72 69 74 65  s::helper::write
0a80: 72 3a 3a 4d 6f 64 65 3b 0a 75 73 65 20 73 74 64  r::Mode;.use std
0a90: 3a 3a 73 79 6e 63 3a 3a 7b 41 72 63 2c 20 4d 75  ::sync::{Arc, Mu
0aa0: 74 65 78 7d 3b 0a 0a 66 6e 20 63 72 65 61 74 65  tex};..fn create
0ab0: 5f 61 63 63 6f 75 6e 74 28 29 20 2d 3e 20 52 65  _account() -> Re
0ac0: 73 75 6c 74 3c 43 6c 69 65 6e 74 2c 20 4e 66 73  sult<Client, Nfs
0ad0: 45 72 72 6f 72 3e 20 7b 0a 20 20 20 20 6c 65 74  Error> {.    let
0ae0: 20 6d 75 74 20 73 65 63 72 65 74 5f 30 20 3d 20   mut secret_0 = 
0af0: 53 74 72 69 6e 67 3a 3a 6e 65 77 28 29 3b 0a 20  String::new();. 
0b00: 20 20 20 6c 65 74 20 6d 75 74 20 73 65 63 72 65     let mut secre
0b10: 74 5f 31 20 3d 20 53 74 72 69 6e 67 3a 3a 6e 65  t_1 = String::ne
0b20: 77 28 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 6c  w();..    printl
0b30: 6e 21 28 22 5c 6e 5c 74 41 63 63 6f 75 6e 74 20  n!("\n\tAccount 
0b40: 43 72 65 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20  Creation");.    
0b50: 70 72 69 6e 74 6c 6e 21 28 22 5c 74 3d 3d 3d 3d  println!("\t====
0b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 3b 0a  ============");.
0b70: 0a 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 5c  .    println!("\
0b80: 6e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 45 6e  n------------ En
0b90: 74 65 72 20 61 63 63 6f 75 6e 74 2d 6c 6f 63 61  ter account-loca
0ba0: 74 6f 72 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tor ------------
0bb0: 2d 2d 2d 22 29 3b 0a 20 20 20 20 6c 65 74 20 5f  ---");.    let _
0bc0: 20 3d 20 73 74 64 3a 3a 69 6f 3a 3a 73 74 64 69   = std::io::stdi
0bd0: 6e 28 29 2e 72 65 61 64 5f 6c 69 6e 65 28 26 6d  n().read_line(&m
0be0: 75 74 20 73 65 63 72 65 74 5f 30 29 3b 0a 20 20  ut secret_0);.  
0bf0: 20 20 73 65 63 72 65 74 5f 30 20 3d 20 73 65 63    secret_0 = sec
0c00: 72 65 74 5f 30 2e 74 72 69 6d 28 29 2e 74 6f 5f  ret_0.trim().to_
0c10: 73 74 72 69 6e 67 28 29 3b 0a 0a 20 20 20 20 70  string();..    p
0c20: 72 69 6e 74 6c 6e 21 28 22 5c 6e 2d 2d 2d 2d 2d  rintln!("\n-----
0c30: 2d 2d 2d 2d 2d 2d 2d 20 45 6e 74 65 72 20 70 61  ------- Enter pa
0c40: 73 73 77 6f 72 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ssword ---------
0c50: 2d 2d 2d 2d 2d 2d 22 29 3b 0a 20 20 20 20 6c 65  ------");.    le
0c60: 74 20 5f 20 3d 20 73 74 64 3a 3a 69 6f 3a 3a 73  t _ = std::io::s
0c70: 74 64 69 6e 28 29 2e 72 65 61 64 5f 6c 69 6e 65  tdin().read_line
0c80: 28 26 6d 75 74 20 73 65 63 72 65 74 5f 31 29 3b  (&mut secret_1);
0c90: 0a 20 20 20 20 73 65 63 72 65 74 5f 31 20 3d 20  .    secret_1 = 
0ca0: 73 65 63 72 65 74 5f 31 2e 74 72 69 6d 28 29 2e  secret_1.trim().
0cb0: 74 6f 5f 73 74 72 69 6e 67 28 29 3b 0a 0a 20 20  to_string();..  
0cc0: 20 20 2f 2f 20 41 63 63 6f 75 6e 74 20 43 72 65    // Account Cre
0cd0: 61 74 69 6f 6e 0a 20 20 20 20 70 72 69 6e 74 6c  ation.    printl
0ce0: 6e 21 28 22 5c 6e 54 72 79 69 6e 67 20 74 6f 20  n!("\nTrying to 
0cf0: 63 72 65 61 74 65 20 61 6e 20 61 63 63 6f 75 6e  create an accoun
0d00: 74 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 6c 65 74  t ...");.    let
0d10: 20 5f 20 3d 20 75 6e 77 72 61 70 21 28 43 6c 69   _ = unwrap!(Cli
0d20: 65 6e 74 3a 3a 63 72 65 61 74 65 5f 61 63 63 6f  ent::create_acco
0d30: 75 6e 74 28 26 73 65 63 72 65 74 5f 30 2c 20 26  unt(&secret_0, &
0d40: 73 65 63 72 65 74 5f 31 29 29 3b 0a 20 20 20 20  secret_1));.    
0d50: 70 72 69 6e 74 6c 6e 21 28 22 41 63 63 6f 75 6e  println!("Accoun
0d60: 74 20 43 72 65 61 74 65 64 20 53 75 63 63 65 73  t Created Succes
0d70: 73 66 75 6c 6c 79 20 21 21 22 29 3b 0a 20 20 20  sfully !!");.   
0d80: 20 70 72 69 6e 74 6c 6e 21 28 22 5c 6e 5c 6e 5c   println!("\n\n\
0d90: 74 41 75 74 6f 20 41 63 63 6f 75 6e 74 20 4c 6f  tAuto Account Lo
0da0: 67 69 6e 22 29 3b 0a 20 20 20 20 70 72 69 6e 74  gin");.    print
0db0: 6c 6e 21 28 22 5c 74 3d 3d 3d 3d 3d 3d 3d 3d 3d  ln!("\t=========
0dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 3b 0a 0a 20 20  =========");..  
0dd0: 20 20 2f 2f 20 4c 6f 67 20 69 6e 74 6f 20 74 68    // Log into th
0de0: 65 20 63 72 65 61 74 65 64 20 61 63 63 6f 75 6e  e created accoun
0df0: 74 0a 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22  t.    println!("
0e00: 5c 6e 54 72 79 69 6e 67 20 74 6f 20 6c 6f 67 20  \nTrying to log 
0e10: 69 6e 74 6f 20 74 68 65 20 63 72 65 61 74 65 64  into the created
0e20: 20 61 63 63 6f 75 6e 74 20 75 73 69 6e 67 20 73   account using s
0e30: 75 70 70 6c 69 65 64 20 63 72 65 64 65 6e 74 69  upplied credenti
0e40: 61 6c 73 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 6c  als ...");.    l
0e50: 65 74 20 63 6c 69 65 6e 74 20 3d 20 74 72 79 21  et client = try!
0e60: 28 43 6c 69 65 6e 74 3a 3a 6c 6f 67 5f 69 6e 28  (Client::log_in(
0e70: 26 73 65 63 72 65 74 5f 30 2c 20 26 73 65 63 72  &secret_0, &secr
0e80: 65 74 5f 31 29 29 3b 0a 20 20 20 20 70 72 69 6e  et_1));.    prin
0e90: 74 6c 6e 21 28 22 41 63 63 6f 75 6e 74 20 4c 6f  tln!("Account Lo
0ea0: 67 69 6e 20 53 75 63 63 65 73 73 66 75 6c 20 21  gin Successful !
0eb0: 21 22 29 3b 0a 20 20 20 20 4f 6b 28 63 6c 69 65  !");.    Ok(clie
0ec0: 6e 74 29 0a 7d 0a 0a 66 6e 20 67 65 74 5f 72 6f  nt).}..fn get_ro
0ed0: 6f 74 5f 64 69 72 65 63 74 6f 72 79 28 63 6c 69  ot_directory(cli
0ee0: 65 6e 74 3a 20 41 72 63 3c 4d 75 74 65 78 3c 43  ent: Arc<Mutex<C
0ef0: 6c 69 65 6e 74 3e 3e 29 20 2d 3e 20 52 65 73 75  lient>>) -> Resu
0f00: 6c 74 3c 44 69 72 65 63 74 6f 72 79 4c 69 73 74  lt<DirectoryList
0f10: 69 6e 67 2c 20 4e 66 73 45 72 72 6f 72 3e 20 7b  ing, NfsError> {
0f20: 0a 20 20 20 20 6c 65 74 20 64 69 72 65 63 74 6f  .    let directo
0f30: 72 79 5f 68 65 6c 70 65 72 20 3d 20 44 69 72 65  ry_helper = Dire
0f40: 63 74 6f 72 79 48 65 6c 70 65 72 3a 3a 6e 65 77  ctoryHelper::new
0f50: 28 63 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 29  (client.clone())
0f60: 3b 0a 20 20 20 20 64 69 72 65 63 74 6f 72 79 5f  ;.    directory_
0f70: 68 65 6c 70 65 72 2e 67 65 74 5f 75 73 65 72 5f  helper.get_user_
0f80: 72 6f 6f 74 5f 64 69 72 65 63 74 6f 72 79 5f 6c  root_directory_l
0f90: 69 73 74 69 6e 67 28 29 0a 7d 0a 0a 66 6e 20 67  isting().}..fn g
0fa0: 65 74 5f 75 73 65 72 5f 73 74 72 69 6e 67 28 70  et_user_string(p
0fb0: 6c 61 63 65 68 6f 6c 64 65 72 3a 20 26 73 74 72  laceholder: &str
0fc0: 29 20 2d 3e 20 53 74 72 69 6e 67 20 7b 0a 20 20  ) -> String {.  
0fd0: 20 20 6c 65 74 20 6d 75 74 20 74 78 74 20 3d 20    let mut txt = 
0fe0: 53 74 72 69 6e 67 3a 3a 6e 65 77 28 29 3b 0a 20  String::new();. 
0ff0: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 2d 2d 2d     println!("---
1000: 2d 2d 2d 45 6e 74 65 72 20 7b 7d 2d 2d 2d 2d 2d  ---Enter {}-----
1010: 2d 2d 2d 22 2c 20 70 6c 61 63 65 68 6f 6c 64 65  ---", placeholde
1020: 72 29 3b 0a 20 20 20 20 6c 65 74 20 5f 20 3d 20  r);.    let _ = 
1030: 73 74 64 3a 3a 69 6f 3a 3a 73 74 64 69 6e 28 29  std::io::stdin()
1040: 2e 72 65 61 64 5f 6c 69 6e 65 28 26 6d 75 74 20  .read_line(&mut 
1050: 74 78 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 20  txt);.    while 
1060: 74 78 74 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b  txt.is_empty() {
1070: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e  .        println
1080: 21 28 22 7b 7d 20 63 61 6e 20 6e 6f 74 20 62 65  !("{} can not be
1090: 20 65 6d 70 74 79 22 2c 20 70 6c 61 63 65 68 6f   empty", placeho
10a0: 6c 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  lder);.        p
10b0: 72 69 6e 74 6c 6e 21 28 22 2d 2d 2d 2d 2d 2d 45  rintln!("------E
10c0: 6e 74 65 72 20 44 69 72 65 63 74 6f 72 79 20 6e  nter Directory n
10d0: 61 6d 65 2d 2d 2d 2d 2d 2d 2d 2d 22 29 3b 0a 20  ame--------");. 
10e0: 20 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 73         let _ = s
10f0: 74 64 3a 3a 69 6f 3a 3a 73 74 64 69 6e 28 29 2e  td::io::stdin().
1100: 72 65 61 64 5f 6c 69 6e 65 28 26 6d 75 74 20 74  read_line(&mut t
1110: 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  xt);.    }.    t
1120: 78 74 0a 7d 0a 0a 23 5b 63 66 67 5f 61 74 74 72  xt.}..#[cfg_attr
1130: 28 66 65 61 74 75 72 65 3d 22 63 6c 69 70 70 79  (feature="clippy
1140: 22 2c 20 61 6c 6c 6f 77 28 69 6e 64 65 78 69 6e  ", allow(indexin
1150: 67 5f 73 6c 69 63 69 6e 67 29 29 5d 0a 66 6e 20  g_slicing))].fn 
1160: 66 6f 72 6d 61 74 5f 76 65 72 73 69 6f 6e 5f 69  format_version_i
1170: 64 28 76 65 72 73 69 6f 6e 5f 69 64 3a 20 26 5b  d(version_id: &[
1180: 75 38 3b 20 58 4f 52 5f 4e 41 4d 45 5f 4c 45 4e  u8; XOR_NAME_LEN
1190: 5d 29 20 2d 3e 20 53 74 72 69 6e 67 20 7b 0a 20  ]) -> String {. 
11a0: 20 20 20 6c 65 74 20 6d 75 74 20 76 65 72 73 69     let mut versi
11b0: 6f 6e 20 3d 20 53 74 72 69 6e 67 3a 3a 6e 65 77  on = String::new
11c0: 28 29 3b 0a 20 20 20 20 66 6f 72 20 62 79 74 65  ();.    for byte
11d0: 20 69 6e 20 26 76 65 72 73 69 6f 6e 5f 69 64 5b   in &version_id[
11e0: 30 2e 2e 34 5d 20 7b 0a 20 20 20 20 20 20 20 20  0..4] {.        
11f0: 76 65 72 73 69 6f 6e 2e 70 75 73 68 5f 73 74 72  version.push_str
1200: 28 26 62 79 74 65 2e 74 6f 5f 73 74 72 69 6e 67  (&byte.to_string
1210: 28 29 5b 2e 2e 5d 29 3b 0a 20 20 20 20 7d 0a 20  ()[..]);.    }. 
1220: 20 20 20 76 65 72 73 69 6f 6e 2e 70 75 73 68 5f     version.push_
1230: 73 74 72 28 22 2e 2e 22 29 3b 0a 20 20 20 20 66  str("..");.    f
1240: 6f 72 20 62 79 74 65 20 69 6e 20 26 76 65 72 73  or byte in &vers
1250: 69 6f 6e 5f 69 64 5b 28 58 4f 52 5f 4e 41 4d 45  ion_id[(XOR_NAME
1260: 5f 4c 45 4e 20 2d 20 34 29 2e 2e 58 4f 52 5f 4e  _LEN - 4)..XOR_N
1270: 41 4d 45 5f 4c 45 4e 5d 20 7b 0a 20 20 20 20 20  AME_LEN] {.     
1280: 20 20 20 76 65 72 73 69 6f 6e 2e 70 75 73 68 5f     version.push_
1290: 73 74 72 28 26 62 79 74 65 2e 74 6f 5f 73 74 72  str(&byte.to_str
12a0: 69 6e 67 28 29 5b 2e 2e 5d 29 3b 0a 20 20 20 20  ing()[..]);.    
12b0: 7d 0a 20 20 20 20 76 65 72 73 69 6f 6e 0a 7d 0a  }.    version.}.
12c0: 0a 66 6e 20 67 65 74 5f 63 68 69 6c 64 5f 64 69  .fn get_child_di
12d0: 72 65 63 74 6f 72 79 28 63 6c 69 65 6e 74 3a 20  rectory(client: 
12e0: 41 72 63 3c 4d 75 74 65 78 3c 43 6c 69 65 6e 74  Arc<Mutex<Client
12f0: 3e 3e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >>,.            
1300: 20 20 20 20 20 20 20 20 20 20 20 64 69 72 65 63             direc
1310: 74 6f 72 79 3a 20 26 6d 75 74 20 44 69 72 65 63  tory: &mut Direc
1320: 74 6f 72 79 4c 69 73 74 69 6e 67 29 0a 20 20 20  toryListing).   
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 2d 3e 20 52 65 73 75 6c 74 3c 44 69      -> Result<Di
1350: 72 65 63 74 6f 72 79 4c 69 73 74 69 6e 67 2c 20  rectoryListing, 
1360: 4e 66 73 45 72 72 6f 72 3e 20 7b 0a 20 20 20 20  NfsError> {.    
1370: 6c 65 74 20 64 69 72 65 63 74 6f 72 79 5f 6e 61  let directory_na
1380: 6d 65 20 3d 20 26 67 65 74 5f 75 73 65 72 5f 73  me = &get_user_s
1390: 74 72 69 6e 67 28 22 44 69 72 65 63 74 6f 72 79  tring("Directory
13a0: 20 6e 61 6d 65 22 29 3b 0a 20 20 20 20 6c 65 74   name");.    let
13b0: 20 64 69 72 65 63 74 6f 72 79 5f 6d 65 74 61 64   directory_metad
13c0: 61 74 61 20 3d 20 74 72 79 21 28 64 69 72 65 63  ata = try!(direc
13d0: 74 6f 72 79 2e 66 69 6e 64 5f 73 75 62 5f 64 69  tory.find_sub_di
13e0: 72 65 63 74 6f 72 79 28 64 69 72 65 63 74 6f 72  rectory(director
13f0: 79 5f 6e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  y_name).        
1400: 2e 6f 6b 5f 6f 72 28 4e 66 73 45 72 72 6f 72 3a  .ok_or(NfsError:
1410: 3a 44 69 72 65 63 74 6f 72 79 4e 6f 74 46 6f 75  :DirectoryNotFou
1420: 6e 64 29 29 3b 0a 20 20 20 20 6c 65 74 20 64 69  nd));.    let di
1430: 72 65 63 74 6f 72 79 5f 68 65 6c 70 65 72 20 3d  rectory_helper =
1440: 20 44 69 72 65 63 74 6f 72 79 48 65 6c 70 65 72   DirectoryHelper
1450: 3a 3a 6e 65 77 28 63 6c 69 65 6e 74 29 3b 0a 0a  ::new(client);..
1460: 20 20 20 20 64 69 72 65 63 74 6f 72 79 5f 68 65      directory_he
1470: 6c 70 65 72 2e 67 65 74 28 64 69 72 65 63 74 6f  lper.get(directo
1480: 72 79 5f 6d 65 74 61 64 61 74 61 2e 67 65 74 5f  ry_metadata.get_
1490: 6b 65 79 28 29 29 0a 7d 0a 0a 66 6e 20 64 69 72  key()).}..fn dir
14a0: 65 63 74 6f 72 79 5f 6f 70 65 72 61 74 69 6f 6e  ectory_operation
14b0: 28 6f 70 74 69 6f 6e 3a 20 75 33 32 2c 0a 20 20  (option: u32,.  
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 63 6c 69 65 6e 74 3a 20 41 72 63       client: Arc
14e0: 3c 4d 75 74 65 78 3c 43 6c 69 65 6e 74 3e 3e 2c  <Mutex<Client>>,
14f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1500: 20 20 20 20 20 20 20 20 6d 75 74 20 64 69 72 65          mut dire
1510: 63 74 6f 72 79 3a 20 26 6d 75 74 20 44 69 72 65  ctory: &mut Dire
1520: 63 74 6f 72 79 4c 69 73 74 69 6e 67 29 0a 20 20  ctoryListing).  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 2d 3e 20 52 65 73 75 6c 74 3c 28       -> Result<(
1550: 29 2c 20 4e 66 73 45 72 72 6f 72 3e 20 7b 0a 20  ), NfsError> {. 
1560: 20 20 20 6d 61 74 63 68 20 6f 70 74 69 6f 6e 20     match option 
1570: 7b 0a 20 20 20 20 20 20 20 20 31 20 3d 3e 20 7b  {.        1 => {
1580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
1590: 43 72 65 61 74 65 20 64 69 72 65 63 74 6f 72 79  Create directory
15a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
15b0: 6e 74 6c 6e 21 28 22 2d 2d 2d 2d 2d 2d 2d 2d 2d  ntln!("---------
15c0: 2d 53 65 6c 65 63 74 20 74 68 65 20 44 69 72 65  -Select the Dire
15d0: 63 74 6f 72 79 20 74 79 70 65 2d 2d 2d 2d 2d 2d  ctory type------
15e0: 2d 2d 2d 2d 2d 22 29 3b 0a 20 20 20 20 20 20 20  -----");.       
15f0: 20 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 31       println!("1
1600: 2e 20 56 65 72 73 69 6f 6e 65 64 20 50 72 69 76  . Versioned Priv
1610: 61 74 65 20 44 69 72 65 63 74 6f 72 79 22 29 3b  ate Directory");
1620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
1630: 6e 74 6c 6e 21 28 22 32 2e 20 56 65 72 73 69 6f  ntln!("2. Versio
1640: 6e 65 64 20 50 75 62 6c 69 63 20 44 69 72 65 63  ned Public Direc
1650: 74 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20  tory");.        
1660: 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 33 2e      println!("3.
1670: 20 55 6e 56 65 72 73 69 6f 6e 65 64 20 50 72 69   UnVersioned Pri
1680: 76 61 74 65 20 44 69 72 65 63 74 6f 72 79 22 29  vate Directory")
1690: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
16a0: 69 6e 74 6c 6e 21 28 22 34 2e 20 55 6e 56 65 72  intln!("4. UnVer
16b0: 73 69 6f 6e 65 64 20 50 75 62 6c 69 63 20 44 69  sioned Public Di
16c0: 72 65 63 74 6f 72 79 22 29 3b 0a 20 20 20 20 20  rectory");.     
16d0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 67 65 74         match get
16e0: 5f 75 73 65 72 5f 73 74 72 69 6e 67 28 22 6e 75  _user_string("nu
16f0: 6d 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  mber correspondi
1700: 6e 67 20 74 6f 20 74 68 65 20 74 79 70 65 22 29  ng to the type")
1710: 2e 74 72 69 6d 28 29 2e 70 61 72 73 65 3a 3a 3c  .trim().parse::<
1720: 75 73 69 7a 65 3e 28 29 20 7b 0a 20 20 20 20 20  usize>() {.     
1730: 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28 69 6e             Ok(in
1740: 64 65 78 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  dex) => {.      
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1760: 20 69 6e 64 65 78 20 3e 20 34 20 7b 0a 20 20 20   index > 4 {.   
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 20 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 49       println!("I
1790: 6e 76 61 6c 69 64 20 69 6e 70 75 74 22 29 3b 0a  nvalid input");.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f          return O
17c0: 6b 28 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  k(());.         
17d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 6c 65 74 20 6e 61 6d 65 20 3d 20 67 65 74 5f   let name = get_
1800: 75 73 65 72 5f 73 74 72 69 6e 67 28 22 44 69 72  user_string("Dir
1810: 65 63 74 6f 72 79 20 6e 61 6d 65 22 29 3b 0a 20  ectory name");. 
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 6c 65 74 20 76 65 72 73 69 6f 6e 65 64     let versioned
1840: 20 3d 20 6d 61 74 63 68 20 69 6e 64 65 78 20 7b   = match index {
1850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1860: 20 20 20 20 20 20 20 20 20 33 20 7c 20 34 20 3d           3 | 4 =
1870: 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  > false,.       
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 5f 20 3d 3e 20 74 72 75 65 2c 0a 20 20 20 20   _ => true,.    
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
18c0: 20 20 20 20 20 20 20 6c 65 74 20 61 63 63 65 73         let acces
18d0: 73 5f 6c 65 76 65 6c 20 3d 20 6d 61 74 63 68 20  s_level = match 
18e0: 69 6e 64 65 78 20 7b 0a 20 20 20 20 20 20 20 20  index {.        
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 32 20 7c 20 34 20 3d 3e 20 41 63 63 65 73 73 4c  2 | 4 => AccessL
1910: 65 76 65 6c 3a 3a 50 75 62 6c 69 63 2c 0a 20 20  evel::Public,.  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 5f 20 3d 3e 20 41 63 63 65 73        _ => Acces
1940: 73 4c 65 76 65 6c 3a 3a 50 72 69 76 61 74 65 2c  sLevel::Private,
1950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1960: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1980: 6e 61 6d 65 2e 69 73 5f 65 6d 70 74 79 28 29 20  name.is_empty() 
1990: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
19a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19b0: 20 45 72 72 28 4e 66 73 45 72 72 6f 72 3a 3a 50   Err(NfsError::P
19c0: 61 72 61 6d 65 74 65 72 49 73 4e 6f 74 56 61 6c  arameterIsNotVal
19d0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
19e0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 6c 65 74 20 74 61 67 5f 74 79 70 65 20 3d 20 69  let tag_type = i
1a10: 66 20 76 65 72 73 69 6f 6e 65 64 20 7b 0a 20 20  f versioned {.  
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 6e 66 73 3a 3a 56 45 52 53 49        nfs::VERSI
1a40: 4f 4e 45 44 5f 44 49 52 45 43 54 4f 52 59 5f 4c  ONED_DIRECTORY_L
1a50: 49 53 54 49 4e 47 5f 54 41 47 0a 20 20 20 20 20  ISTING_TAG.     
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1a70: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 6e 66 73 3a 3a 55 4e 56 45 52 53 49 4f 4e 45 44  nfs::UNVERSIONED
1aa0: 5f 44 49 52 45 43 54 4f 52 59 5f 4c 49 53 54 49  _DIRECTORY_LISTI
1ab0: 4e 47 5f 54 41 47 0a 20 20 20 20 20 20 20 20 20  NG_TAG.         
1ac0: 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20             };.. 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 6c 65 74 20 64 69 72 65 63 74 6f 72 79     let directory
1af0: 5f 68 65 6c 70 65 72 20 3d 20 44 69 72 65 63 74  _helper = Direct
1b00: 6f 72 79 48 65 6c 70 65 72 3a 3a 6e 65 77 28 63  oryHelper::new(c
1b10: 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 29 3b 0a  lient.clone());.
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 20 20 6c 65 74 20 5f 20 3d 20 74 72 79 21      let _ = try!
1b40: 28 64 69 72 65 63 74 6f 72 79 5f 68 65 6c 70 65  (directory_helpe
1b50: 72 2e 63 72 65 61 74 65 28 6e 61 6d 65 2e 63 6c  r.create(name.cl
1b60: 6f 6e 65 28 29 2c 0a 20 20 20 20 20 20 20 20 20  one(),.         
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 74 61 67 5f 74 79 70 65 2c 0a 20 20 20 20 20 20  tag_type,.      
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 20 76 65 63 21 5b 5d 2c 0a 20 20 20 20 20     vec![],.     
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 76 65 72 73 69 6f 6e 65 64 2c 0a 20      versioned,. 
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 20 20 61 63 63 65 73 73 5f 6c          access_l
1c70: 65 76 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  evel,.          
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1cb0: 6f 6d 65 28 26 6d 75 74 20 64 69 72 65 63 74 6f  ome(&mut directo
1cc0: 72 79 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ry)));.         
1cd0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
1ce0: 6c 6e 21 28 22 43 72 65 61 74 65 64 20 44 69 72  ln!("Created Dir
1cf0: 65 63 74 6f 72 79 20 2d 20 7b 7d 22 2c 20 6e 61  ectory - {}", na
1d00: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
1d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d20: 20 20 20 20 20 20 20 45 72 72 28 5f 29 20 3d 3e         Err(_) =>
1d30: 20 70 72 69 6e 74 6c 6e 21 28 22 49 6e 76 61 6c   println!("Inval
1d40: 69 64 20 69 6e 70 75 74 22 29 2c 0a 20 20 20 20  id input"),.    
1d50: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
1d60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 32 20 3d     }.        2 =
1d70: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
1d80: 2f 2f 20 4c 69 73 74 20 64 69 72 65 63 74 6f 72  // List director
1d90: 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ies.            
1da0: 6c 65 74 20 64 69 72 65 63 74 6f 72 79 5f 6d 65  let directory_me
1db0: 74 61 64 61 74 61 20 3d 20 64 69 72 65 63 74 6f  tadata = directo
1dc0: 72 79 2e 67 65 74 5f 73 75 62 5f 64 69 72 65 63  ry.get_sub_direc
1dd0: 74 6f 72 69 65 73 28 29 3b 0a 20 20 20 20 20 20  tories();.      
1de0: 20 20 20 20 20 20 69 66 20 64 69 72 65 63 74 6f        if directo
1df0: 72 79 5f 6d 65 74 61 64 61 74 61 2e 69 73 5f 65  ry_metadata.is_e
1e00: 6d 70 74 79 28 29 20 7b 0a 20 20 20 20 20 20 20  mpty() {.       
1e10: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e           println
1e20: 21 28 22 4e 6f 20 64 69 72 65 63 74 6f 72 69 65  !("No directorie
1e30: 73 20 66 6f 75 6e 64 22 29 3b 0a 20 20 20 20 20  s found");.     
1e40: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e60: 70 72 69 6e 74 6c 6e 21 28 22 4c 69 73 74 20 6f  println!("List o
1e70: 66 20 64 69 72 65 63 74 6f 72 69 65 73 22 29 3b  f directories");
1e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e90: 20 70 72 69 6e 74 6c 6e 21 28 22 5c 74 20 20 20   println!("\t   
1ea0: 20 20 20 20 20 43 72 65 61 74 65 64 20 4f 6e 20       Created On 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 4e 61 6d 65 20 22 29 3b 0a 20 20 20 20 20 20   Name ");.      
1ed0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c            printl
1ee0: 6e 21 28 22 5c 74 20 3d 3d 3d 3d 3d 3d 3d 3d 3d  n!("\t =========
1ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f00: 20 20 20 20 20 20 20 3d 3d 3d 3d 3d 3d 3d 3d 3d         =========
1f10: 3d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  =");.           
1f20: 20 20 20 20 20 66 6f 72 20 6d 65 74 61 74 61 74       for metatat
1f30: 61 20 69 6e 20 64 69 72 65 63 74 6f 72 79 5f 6d  a in directory_m
1f40: 65 74 61 64 61 74 61 20 7b 0a 20 20 20 20 20 20  etadata {.      
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1f60: 69 6e 74 6c 6e 21 28 22 5c 74 20 7b 3a 3f 7d 20  intln!("\t {:?} 
1f70: 5c 74 20 7b 7d 22 2c 0a 20 20 20 20 20 20 20 20  \t {}",.        
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 20 20 20 75 6e 77 72 61 70 21 28 74 69 6d       unwrap!(tim
1fa0: 65 3a 3a 73 74 72 66 74 69 6d 65 28 22 25 64 2d  e::strftime("%d-
1fb0: 25 6d 2d 25 59 20 25 48 3a 25 4d 20 55 54 43 22  %m-%Y %H:%M UTC"
1fc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 26 6d 65 74 61 74 61 74 61 2e        &metatata.
2000: 67 65 74 5f 63 72 65 61 74 65 64 5f 74 69 6d 65  get_created_time
2010: 28 29 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ())),.          
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 6d 65 74 61 74 61 74 61 2e 67 65 74 5f     metatata.get_
2040: 6e 61 6d 65 28 29 29 3b 0a 20 20 20 20 20 20 20  name());.       
2050: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2070: 20 7d 0a 20 20 20 20 20 20 20 20 33 20 3d 3e 20   }.        3 => 
2080: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
2090: 20 4c 69 73 74 20 76 65 72 73 69 6f 6e 73 0a 20   List versions. 
20a0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 63             let c
20b0: 68 69 6c 64 20 3d 20 74 72 79 21 28 67 65 74 5f  hild = try!(get_
20c0: 63 68 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 28  child_directory(
20d0: 63 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 20  client.clone(), 
20e0: 64 69 72 65 63 74 6f 72 79 29 29 3b 0a 20 20 20  directory));.   
20f0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 64 69 72           let dir
2100: 65 63 74 6f 72 79 5f 68 65 6c 70 65 72 20 3d 20  ectory_helper = 
2110: 44 69 72 65 63 74 6f 72 79 48 65 6c 70 65 72 3a  DirectoryHelper:
2120: 3a 6e 65 77 28 63 6c 69 65 6e 74 2e 63 6c 6f 6e  :new(client.clon
2130: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e());.          
2140: 20 20 6c 65 74 20 76 65 72 73 69 6f 6e 73 20 3d    let versions =
2150: 20 74 72 79 21 28 64 69 72 65 63 74 6f 72 79 5f   try!(directory_
2160: 68 65 6c 70 65 72 2e 67 65 74 5f 76 65 72 73 69  helper.get_versi
2170: 6f 6e 73 28 63 68 69 6c 64 2e 67 65 74 5f 6b 65  ons(child.get_ke
2180: 79 28 29 2e 67 65 74 5f 69 64 28 29 2c 0a 20 20  y().get_id(),.  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 69 6c              chil
21d0: 64 2e 67 65 74 5f 6b 65 79 28 29 2e 67 65 74 5f  d.get_key().get_
21e0: 74 79 70 65 5f 74 61 67 28 29 29 29 3b 0a 20 20  type_tag()));.  
21f0: 20 20 20 20 20 20 20 20 20 20 69 66 20 76 65 72            if ver
2200: 73 69 6f 6e 73 2e 69 73 5f 65 6d 70 74 79 28 29  sions.is_empty()
2210: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2220: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 4e 6f 20     println!("No 
2230: 64 69 72 65 63 74 6f 72 79 20 76 65 72 73 69 6f  directory versio
2240: 6e 73 20 66 6f 75 6e 64 22 29 3b 0a 20 20 20 20  ns found");.    
2250: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2270: 20 70 72 69 6e 74 6c 6e 21 28 22 4c 69 73 74 20   println!("List 
2280: 6f 66 20 64 69 72 65 63 74 6f 72 79 20 76 65 72  of directory ver
2290: 73 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 20  sions");.       
22a0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e           println
22b0: 21 28 22 5c 74 20 4e 6f 2e 20 5c 74 20 56 65 72  !("\t No. \t Ver
22c0: 73 69 6f 6e 20 49 64 22 29 3b 0a 20 20 20 20 20  sion Id");.     
22d0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
22e0: 6c 6e 21 28 22 5c 74 20 3d 3d 3d 20 5c 74 20 3d  ln!("\t === \t =
22f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 3b 0a 20 20 20  =========");.   
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2310: 20 28 69 2c 20 76 65 72 73 69 6f 6e 29 20 69 6e   (i, version) in
2320: 20 76 65 72 73 69 6f 6e 73 2e 69 74 65 72 28 29   versions.iter()
2330: 2e 65 6e 75 6d 65 72 61 74 65 28 29 20 7b 0a 20  .enumerate() {. 
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 5c 74 20     println!("\t 
2360: 7b 7d 20 5c 74 20 7b 3a 3f 7d 22 2c 20 69 20 2b  {} \t {:?}", i +
2370: 20 31 2c 20 66 6f 72 6d 61 74 5f 76 65 72 73 69   1, format_versi
2380: 6f 6e 5f 69 64 28 26 76 65 72 73 69 6f 6e 2e 30  on_id(&version.0
2390: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
23a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23c0: 20 20 20 20 20 20 34 20 3d 3e 20 7b 0a 20 20 20        4 => {.   
23d0: 20 20 20 20 20 20 20 20 20 2f 2f 20 44 65 6c 65           // Dele
23e0: 74 65 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20  te directory.   
23f0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 64 69 72           let dir
2400: 65 63 74 6f 72 79 5f 68 65 6c 70 65 72 20 3d 20  ectory_helper = 
2410: 44 69 72 65 63 74 6f 72 79 48 65 6c 70 65 72 3a  DirectoryHelper:
2420: 3a 6e 65 77 28 63 6c 69 65 6e 74 2e 63 6c 6f 6e  :new(client.clon
2430: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e());.          
2440: 20 20 6c 65 74 20 5f 20 3d 0a 20 20 20 20 20 20    let _ =.      
2450: 20 20 20 20 20 20 20 20 20 20 74 72 79 21 28 64            try!(d
2460: 69 72 65 63 74 6f 72 79 5f 68 65 6c 70 65 72 2e  irectory_helper.
2470: 64 65 6c 65 74 65 28 26 6d 75 74 20 64 69 72 65  delete(&mut dire
2480: 63 74 6f 72 79 2c 20 26 67 65 74 5f 75 73 65 72  ctory, &get_user
2490: 5f 73 74 72 69 6e 67 28 22 44 69 72 65 63 74 6f  _string("Directo
24a0: 72 79 20 6e 61 6d 65 22 29 29 29 3b 0a 20 20 20  ry name")));.   
24b0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e           println
24c0: 21 28 22 44 69 72 65 63 74 6f 72 79 20 64 65 6c  !("Directory del
24d0: 65 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  eted");.        
24e0: 7d 0a 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b  }.        _ => {
24f0: 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 4f 6b 28  }.    };.    Ok(
2500: 28 29 29 0a 7d 0a 0a 66 6e 20 66 69 6c 65 5f 6f  ()).}..fn file_o
2510: 70 65 72 61 74 69 6f 6e 28 6f 70 74 69 6f 6e 3a  peration(option:
2520: 20 75 33 32 2c 0a 20 20 20 20 20 20 20 20 20 20   u32,.          
2530: 20 20 20 20 20 20 20 20 63 6c 69 65 6e 74 3a 20          client: 
2540: 41 72 63 3c 4d 75 74 65 78 3c 43 6c 69 65 6e 74  Arc<Mutex<Client
2550: 3e 3e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >>,.            
2560: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 3a        directory:
2570: 20 26 6d 75 74 20 44 69 72 65 63 74 6f 72 79 4c   &mut DirectoryL
2580: 69 73 74 69 6e 67 29 0a 20 20 20 20 20 20 20 20  isting).        
2590: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 65 73            -> Res
25a0: 75 6c 74 3c 28 29 2c 20 4e 66 73 45 72 72 6f 72  ult<(), NfsError
25b0: 3e 20 7b 0a 20 20 20 20 6d 61 74 63 68 20 6f 70  > {.    match op
25c0: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 35  tion {.        5
25d0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
25e0: 20 20 2f 2f 20 4c 69 73 74 20 66 69 6c 65 73 0a    // List files.
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
2600: 63 68 69 6c 64 20 3d 20 74 72 79 21 28 67 65 74  child = try!(get
2610: 5f 63 68 69 6c 64 5f 64 69 72 65 63 74 6f 72 79  _child_directory
2620: 28 63 6c 69 65 6e 74 2c 20 64 69 72 65 63 74 6f  (client, directo
2630: 72 79 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry));.          
2640: 20 20 6c 65 74 20 66 69 6c 65 73 20 3d 20 63 68    let files = ch
2650: 69 6c 64 2e 67 65 74 5f 66 69 6c 65 73 28 29 3b  ild.get_files();
2660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
2670: 66 69 6c 65 73 2e 69 73 5f 65 6d 70 74 79 28 29  files.is_empty()
2680: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2690: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 4e 6f 20     println!("No 
26a0: 46 69 6c 65 73 20 66 6f 75 6e 64 20 69 6e 20 44  Files found in D
26b0: 69 72 65 63 74 6f 72 79 20 2d 20 7b 7d 22 2c 0a  irectory - {}",.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 20 20 20 20 20 63 68 69 6c 64 2e 67           child.g
26e0: 65 74 5f 6d 65 74 61 64 61 74 61 28 29 2e 67 65  et_metadata().ge
26f0: 74 5f 6e 61 6d 65 28 29 29 3b 0a 20 20 20 20 20  t_name());.     
2700: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 70 72 69 6e 74 6c 6e 21 28 22 4c 69 73 74 20 6f  println!("List o
2730: 66 20 46 69 6c 65 73 22 29 3b 0a 20 20 20 20 20  f Files");.     
2740: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
2750: 6c 6e 21 28 22 5c 74 20 20 20 20 20 20 20 20 4d  ln!("\t        M
2760: 6f 64 69 66 69 65 64 20 4f 6e 20 20 20 20 20 20  odified On      
2770: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 20 22            Name "
2780: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2790: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 5c 74 20     println!("\t 
27a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
27b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 20 20 20 20 20 20 3d  =========      =
27c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 22 29 3b 0a 20 20  ==========");.  
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
27e0: 72 20 66 69 6c 65 20 69 6e 20 66 69 6c 65 73 20  r file in files 
27f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2800: 20 20 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22        println!("
2810: 5c 74 20 7b 3a 3f 7d 20 5c 74 20 7b 7d 22 2c 0a  \t {:?} \t {}",.
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 77               unw
2840: 72 61 70 21 28 74 69 6d 65 3a 3a 73 74 72 66 74  rap!(time::strft
2850: 69 6d 65 28 22 25 64 2d 25 6d 2d 25 59 20 25 48  ime("%d-%m-%Y %H
2860: 3a 25 4d 20 55 54 43 22 2c 0a 20 20 20 20 20 20  :%M UTC",.      
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 66                &f
28a0: 69 6c 65 2e 67 65 74 5f 6d 65 74 61 64 61 74 61  ile.get_metadata
28b0: 28 29 2e 67 65 74 5f 6d 6f 64 69 66 69 65 64 5f  ().get_modified_
28c0: 74 69 6d 65 28 29 29 29 2c 0a 20 20 20 20 20 20  time())),.      
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 66 69 6c 65 2e 67 65 74 5f         file.get_
28f0: 6e 61 6d 65 28 29 29 3b 0a 20 20 20 20 20 20 20  name());.       
2900: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2920: 20 7d 0a 20 20 20 20 20 20 20 20 36 20 3d 3e 20   }.        6 => 
2930: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
2940: 20 43 72 65 61 74 65 20 66 69 6c 65 0a 20 20 20   Create file.   
2950: 20 20 20 20 20 20 20 20 20 6c 65 74 20 63 68 69           let chi
2960: 6c 64 20 3d 20 74 72 79 21 28 67 65 74 5f 63 68  ld = try!(get_ch
2970: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 28 63 6c  ild_directory(cl
2980: 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 20 64 69  ient.clone(), di
2990: 72 65 63 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  rectory));.     
29a0: 20 20 20 20 20 20 20 6c 65 74 20 64 61 74 61 20         let data 
29b0: 3d 20 67 65 74 5f 75 73 65 72 5f 73 74 72 69 6e  = get_user_strin
29c0: 67 28 22 74 65 78 74 20 74 6f 20 62 65 20 73 61  g("text to be sa
29d0: 76 65 64 20 61 73 20 61 20 66 69 6c 65 22 29 2e  ved as a file").
29e0: 69 6e 74 6f 5f 62 79 74 65 73 28 29 3b 0a 20 20  into_bytes();.  
29f0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
2a00: 74 20 66 69 6c 65 5f 68 65 6c 70 65 72 20 3d 20  t file_helper = 
2a10: 46 69 6c 65 48 65 6c 70 65 72 3a 3a 6e 65 77 28  FileHelper::new(
2a20: 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  client);.       
2a30: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 77 72 69       let mut wri
2a40: 74 65 72 20 3d 20 74 72 79 21 28 66 69 6c 65 5f  ter = try!(file_
2a50: 68 65 6c 70 65 72 2e 63 72 65 61 74 65 28 67 65  helper.create(ge
2a60: 74 5f 75 73 65 72 5f 73 74 72 69 6e 67 28 22 46  t_user_string("F
2a70: 69 6c 65 20 6e 61 6d 65 22 29 2c 20 76 65 63 21  ile name"), vec!
2a80: 5b 5d 2c 20 63 68 69 6c 64 29 29 3b 0a 0a 20 20  [], child));..  
2a90: 20 20 20 20 20 20 20 20 20 20 74 72 79 21 28 77            try!(w
2aa0: 72 69 74 65 72 2e 77 72 69 74 65 28 26 64 61 74  riter.write(&dat
2ab0: 61 5b 2e 2e 5d 29 29 3b 0a 20 20 20 20 20 20 20  a[..]));.       
2ac0: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 74 72 79       let _ = try
2ad0: 21 28 77 72 69 74 65 72 2e 63 6c 6f 73 65 28 29  !(writer.close()
2ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2af0: 72 69 6e 74 6c 6e 21 28 22 46 69 6c 65 20 63 72  rintln!("File cr
2b00: 65 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20 20  eated");.       
2b10: 20 7d 0a 20 20 20 20 20 20 20 20 37 20 3d 3e 20   }.        7 => 
2b20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
2b30: 20 55 70 64 61 74 65 20 66 69 6c 65 0a 20 20 20   Update file.   
2b40: 20 20 20 20 20 20 20 20 20 6c 65 74 20 63 68 69           let chi
2b50: 6c 64 20 3d 20 74 72 79 21 28 67 65 74 5f 63 68  ld = try!(get_ch
2b60: 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 28 63 6c  ild_directory(cl
2b70: 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 20 64 69  ient.clone(), di
2b80: 72 65 63 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  rectory));.     
2b90: 20 20 20 20 20 20 20 6c 65 74 20 66 69 6c 65 20         let file 
2ba0: 3d 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 66 69  = if let Some(fi
2bb0: 6c 65 29 20 3d 20 63 68 69 6c 64 2e 66 69 6e 64  le) = child.find
2bc0: 5f 66 69 6c 65 28 26 67 65 74 5f 75 73 65 72 5f  _file(&get_user_
2bd0: 73 74 72 69 6e 67 28 22 46 69 6c 65 20 6e 61 6d  string("File nam
2be0: 65 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e")) {.         
2bf0: 20 20 20 20 20 20 20 66 69 6c 65 0a 20 20 20 20         file.    
2c00: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c20: 20 72 65 74 75 72 6e 20 45 72 72 28 4e 66 73 45   return Err(NfsE
2c30: 72 72 6f 72 3a 3a 46 69 6c 65 4e 6f 74 46 6f 75  rror::FileNotFou
2c40: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nd);.           
2c50: 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   };.            
2c60: 6c 65 74 20 64 61 74 61 20 3d 20 67 65 74 5f 75  let data = get_u
2c70: 73 65 72 5f 73 74 72 69 6e 67 28 22 74 65 78 74  ser_string("text
2c80: 20 74 6f 20 62 65 20 73 61 76 65 64 20 61 73 20   to be saved as 
2c90: 61 20 66 69 6c 65 22 29 2e 69 6e 74 6f 5f 62 79  a file").into_by
2ca0: 74 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20 20  tes();.         
2cb0: 20 20 20 6c 65 74 20 6d 75 74 20 66 69 6c 65 5f     let mut file_
2cc0: 68 65 6c 70 65 72 20 3d 20 46 69 6c 65 48 65 6c  helper = FileHel
2cd0: 70 65 72 3a 3a 6e 65 77 28 63 6c 69 65 6e 74 29  per::new(client)
2ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
2cf0: 74 20 6d 75 74 20 77 72 69 74 65 72 20 3d 0a 20  t mut writer =. 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2d10: 72 79 21 28 66 69 6c 65 5f 68 65 6c 70 65 72 2e  ry!(file_helper.
2d20: 75 70 64 61 74 65 5f 63 6f 6e 74 65 6e 74 28 66  update_content(f
2d30: 69 6c 65 2e 63 6c 6f 6e 65 28 29 2c 20 4d 6f 64  ile.clone(), Mod
2d40: 65 3a 3a 4f 76 65 72 77 72 69 74 65 2c 20 63 68  e::Overwrite, ch
2d50: 69 6c 64 2e 63 6c 6f 6e 65 28 29 29 29 3b 0a 20  ild.clone()));. 
2d60: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 21 28             try!(
2d70: 77 72 69 74 65 72 2e 77 72 69 74 65 28 26 64 61  writer.write(&da
2d80: 74 61 5b 2e 2e 5d 29 29 3b 0a 20 20 20 20 20 20  ta[..]));.      
2d90: 20 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 74 72        let _ = tr
2da0: 79 21 28 77 72 69 74 65 72 2e 63 6c 6f 73 65 28  y!(writer.close(
2db0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2dc0: 70 72 69 6e 74 6c 6e 21 28 22 46 69 6c 65 20 55  println!("File U
2dd0: 70 64 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  pdated");.      
2de0: 20 20 7d 0a 20 20 20 20 20 20 20 20 38 20 3d 3e    }.        8 =>
2df0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
2e00: 2f 20 52 65 61 64 20 66 69 6c 65 0a 20 20 20 20  / Read file.    
2e10: 20 20 20 20 20 20 20 20 6c 65 74 20 63 68 69 6c          let chil
2e20: 64 20 3d 20 74 72 79 21 28 67 65 74 5f 63 68 69  d = try!(get_chi
2e30: 6c 64 5f 64 69 72 65 63 74 6f 72 79 28 63 6c 69  ld_directory(cli
2e40: 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 20 64 69 72  ent.clone(), dir
2e50: 65 63 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  ectory));.      
2e60: 20 20 20 20 20 20 6c 65 74 20 66 69 6c 65 20 3d        let file =
2e70: 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 66 69 6c   if let Some(fil
2e80: 65 29 20 3d 20 63 68 69 6c 64 2e 66 69 6e 64 5f  e) = child.find_
2e90: 66 69 6c 65 28 26 67 65 74 5f 75 73 65 72 5f 73  file(&get_user_s
2ea0: 74 72 69 6e 67 28 22 46 69 6c 65 20 6e 61 6d 65  tring("File name
2eb0: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
2ec0: 20 20 20 20 20 20 66 69 6c 65 0a 20 20 20 20 20        file.     
2ed0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 72 65 74 75 72 6e 20 45 72 72 28 4e 66 73 45 72  return Err(NfsEr
2f00: 72 6f 72 3a 3a 46 69 6c 65 4e 6f 74 46 6f 75 6e  ror::FileNotFoun
2f10: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2f20: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  };.            l
2f30: 65 74 20 6d 75 74 20 66 69 6c 65 5f 68 65 6c 70  et mut file_help
2f40: 65 72 20 3d 20 46 69 6c 65 48 65 6c 70 65 72 3a  er = FileHelper:
2f50: 3a 6e 65 77 28 63 6c 69 65 6e 74 29 3b 0a 20 20  :new(client);.  
2f60: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
2f70: 74 20 72 65 61 64 65 72 20 3d 20 74 72 79 21 28  t reader = try!(
2f80: 66 69 6c 65 5f 68 65 6c 70 65 72 2e 72 65 61 64  file_helper.read
2f90: 28 66 69 6c 65 29 29 3b 0a 20 20 20 20 20 20 20  (file));.       
2fa0: 20 20 20 20 20 6c 65 74 20 64 61 74 61 5f 72 65       let data_re
2fb0: 61 64 20 3d 20 74 72 79 21 28 72 65 61 64 65 72  ad = try!(reader
2fc0: 2e 72 65 61 64 28 30 2c 20 66 69 6c 65 2e 67 65  .read(0, file.ge
2fd0: 74 5f 6d 65 74 61 64 61 74 61 28 29 2e 67 65 74  t_metadata().get
2fe0: 5f 73 69 7a 65 28 29 29 29 3b 0a 0a 20 20 20 20  _size()));..    
2ff0: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 53 74          match St
3000: 72 69 6e 67 3a 3a 66 72 6f 6d 5f 75 74 66 38 28  ring::from_utf8(
3010: 64 61 74 61 5f 72 65 61 64 29 20 7b 0a 20 20 20  data_read) {.   
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28               Ok(
3030: 64 61 74 61 29 20 3d 3e 20 7b 0a 20 20 20 20 20  data) => {.     
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3050: 72 69 6e 74 6c 6e 21 28 22 43 6f 6e 74 65 6e 74  rintln!("Content
3060: 20 52 65 61 64 3a 20 22 29 3b 0a 20 20 20 20 20   Read: ");.     
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3080: 72 69 6e 74 6c 6e 21 28 22 7b 7d 5c 6e 22 2c 20  rintln!("{}\n", 
3090: 64 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  data);.         
30a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30b0: 20 20 20 20 20 20 20 20 20 45 72 72 28 6d 73 67           Err(msg
30c0: 29 20 3d 3e 20 70 72 69 6e 74 6c 6e 21 28 22 46  ) => println!("F
30d0: 61 69 6c 65 64 3a 20 7b 3a 3f 7d 22 2c 20 6d 73  ailed: {:?}", ms
30e0: 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
30f0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
3100: 20 20 20 20 39 20 3d 3e 20 7b 0a 20 20 20 20 20      9 => {.     
3110: 20 20 20 20 20 20 20 2f 2f 20 52 65 61 64 20 66         // Read f
3120: 69 6c 65 20 62 79 20 76 65 72 73 69 6f 6e 0a 20  ile by version. 
3130: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 63             let c
3140: 68 69 6c 64 20 3d 20 74 72 79 21 28 67 65 74 5f  hild = try!(get_
3150: 63 68 69 6c 64 5f 64 69 72 65 63 74 6f 72 79 28  child_directory(
3160: 63 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 20  client.clone(), 
3170: 64 69 72 65 63 74 6f 72 79 29 29 3b 0a 20 20 20  directory));.   
3180: 20 20 20 20 20 20 20 20 20 6c 65 74 20 66 69 6c           let fil
3190: 65 5f 6e 61 6d 65 20 3d 20 67 65 74 5f 75 73 65  e_name = get_use
31a0: 72 5f 73 74 72 69 6e 67 28 22 46 69 6c 65 20 6e  r_string("File n
31b0: 61 6d 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ame");.         
31c0: 20 20 20 6c 65 74 20 66 69 6c 65 20 3d 20 74 72     let file = tr
31d0: 79 21 28 63 68 69 6c 64 2e 66 69 6e 64 5f 66 69  y!(child.find_fi
31e0: 6c 65 28 26 66 69 6c 65 5f 6e 61 6d 65 29 2e 6f  le(&file_name).o
31f0: 6b 5f 6f 72 28 4e 66 73 45 72 72 6f 72 3a 3a 46  k_or(NfsError::F
3200: 69 6c 65 4e 6f 74 46 6f 75 6e 64 29 29 3b 0a 20  ileNotFound));. 
3210: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
3220: 75 74 20 66 69 6c 65 5f 68 65 6c 70 65 72 20 3d  ut file_helper =
3230: 20 46 69 6c 65 48 65 6c 70 65 72 3a 3a 6e 65 77   FileHelper::new
3240: 28 63 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20  (client);.      
3250: 20 20 20 20 20 20 6c 65 74 20 76 65 72 73 69 6f        let versio
3260: 6e 73 20 3d 20 74 72 79 21 28 66 69 6c 65 5f 68  ns = try!(file_h
3270: 65 6c 70 65 72 2e 67 65 74 5f 76 65 72 73 69 6f  elper.get_versio
3280: 6e 73 28 26 66 69 6c 65 2c 20 26 63 68 69 6c 64  ns(&file, &child
3290: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
32a0: 6c 65 74 20 72 65 66 20 66 69 6c 65 5f 76 65 72  let ref file_ver
32b0: 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  sion;.          
32c0: 20 20 69 66 20 76 65 72 73 69 6f 6e 73 2e 6c 65    if versions.le
32d0: 6e 28 29 20 3d 3d 20 31 20 7b 0a 20 20 20 20 20  n() == 1 {.     
32e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f             file_
32f0: 76 65 72 73 69 6f 6e 20 3d 20 75 6e 77 72 61 70  version = unwrap
3300: 21 28 76 65 72 73 69 6f 6e 73 2e 67 65 74 28 30  !(versions.get(0
3310: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
3320: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
3330: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e           println
3340: 21 28 22 41 76 61 69 6c 61 62 6c 65 20 56 65 72  !("Available Ver
3350: 73 69 6f 6e 73 3a 3a 22 29 3b 0a 20 20 20 20 20  sions::");.     
3360: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
3370: 69 2c 20 76 65 72 73 69 6f 6e 29 20 69 6e 20 76  i, version) in v
3380: 65 72 73 69 6f 6e 73 2e 69 74 65 72 28 29 2e 65  ersions.iter().e
3390: 6e 75 6d 65 72 61 74 65 28 29 20 7b 0a 20 20 20  numerate() {.   
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 70 72 69 6e 74 6c 6e 21 28 22 5c 74 7b 7d 20   println!("\t{} 
33c0: 4d 6f 64 69 66 69 65 64 20 61 74 20 7b 3a 3f 7d  Modified at {:?}
33d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 69 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 20  i + 1,.         
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 75 6e 77 72 61 70 21 28 74 69 6d 65      unwrap!(time
3420: 3a 3a 73 74 72 66 74 69 6d 65 28 22 25 64 2d 25  ::strftime("%d-%
3430: 6d 2d 25 59 20 25 48 3a 25 4d 20 55 54 43 22 2c  m-%Y %H:%M UTC",
3440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 26 76 65 72 73 69 6f 6e 2e 67 65       &version.ge
3480: 74 5f 6d 65 74 61 64 61 74 61 28 29 2e 67 65 74  t_metadata().get
3490: 5f 6d 6f 64 69 66 69 65 64 5f 74 69 6d 65 28 29  _modified_time()
34a0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
34b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
34c0: 20 20 20 20 20 20 6d 61 74 63 68 20 67 65 74 5f        match get_
34d0: 75 73 65 72 5f 73 74 72 69 6e 67 28 22 4e 75 6d  user_string("Num
34e0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
34f0: 67 20 74 6f 20 74 68 65 20 76 65 72 73 69 6f 6e  g to the version
3500: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
3510: 20 20 20 20 20 20 20 2e 74 72 69 6d 28 29 0a 20         .trim(). 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 2e 70 61 72 73 65 3a 3a 3c 75 73 69 7a     .parse::<usiz
3540: 65 3e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  e>() {.         
3550: 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28 69 6e             Ok(in
3560: 64 65 78 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  dex) => {.      
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 76 65    if let Some(ve
3590: 72 73 69 6f 6e 29 20 3d 20 76 65 72 73 69 6f 6e  rsion) = version
35a0: 73 2e 67 65 74 28 69 6e 64 65 78 20 2d 20 31 29  s.get(index - 1)
35b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
35d0: 69 6c 65 5f 76 65 72 73 69 6f 6e 20 3d 20 76 65  ile_version = ve
35e0: 72 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 20  rsion;.         
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3600: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 49 6e      println!("In
3630: 76 61 6c 69 64 20 76 65 72 73 69 6f 6e 20 3a 20  valid version : 
3640: 46 65 74 63 68 69 6e 67 20 6c 61 74 65 73 74 20  Fetching latest 
3650: 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20  version");.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 20 20 66 69 6c 65 5f 76 65 72 73         file_vers
3680: 69 6f 6e 20 3d 20 75 6e 77 72 61 70 21 28 76 65  ion = unwrap!(ve
3690: 72 73 69 6f 6e 73 2e 67 65 74 28 30 29 29 3b 0a  rsions.get(0));.
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 45 72 72 28 65 29 20 3d 3e 20 7b 0a      Err(e) => {.
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e 21          println!
3710: 28 22 49 6e 76 61 6c 69 64 20 69 6e 70 75 74 20  ("Invalid input 
3720: 28 7b 7d 29 3a 20 46 65 74 63 68 69 6e 67 20 6c  ({}): Fetching l
3730: 61 74 65 73 74 20 76 65 72 73 69 6f 6e 22 2c 20  atest version", 
3740: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
3750: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
3760: 5f 76 65 72 73 69 6f 6e 20 3d 20 75 6e 77 72 61  _version = unwra
3770: 70 21 28 76 65 72 73 69 6f 6e 73 2e 67 65 74 28  p!(versions.get(
3780: 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0));.           
3790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
37b0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
37c0: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20          let mut 
37d0: 72 65 61 64 65 72 20 3d 20 74 72 79 21 28 66 69  reader = try!(fi
37e0: 6c 65 5f 68 65 6c 70 65 72 2e 72 65 61 64 28 66  le_helper.read(f
37f0: 69 6c 65 5f 76 65 72 73 69 6f 6e 29 29 3b 0a 20  ile_version));. 
3800: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 64             let d
3810: 61 74 61 5f 72 65 61 64 20 3d 20 74 72 79 21 28  ata_read = try!(
3820: 72 65 61 64 65 72 2e 72 65 61 64 28 30 2c 20 66  reader.read(0, f
3830: 69 6c 65 5f 76 65 72 73 69 6f 6e 2e 67 65 74 5f  ile_version.get_
3840: 6d 65 74 61 64 61 74 61 28 29 2e 67 65 74 5f 73  metadata().get_s
3850: 69 7a 65 28 29 29 29 3b 0a 0a 20 20 20 20 20 20  ize()));..      
3860: 20 20 20 20 20 20 6d 61 74 63 68 20 53 74 72 69        match Stri
3870: 6e 67 3a 3a 66 72 6f 6d 5f 75 74 66 38 28 64 61  ng::from_utf8(da
3880: 74 61 5f 72 65 61 64 29 20 7b 0a 20 20 20 20 20  ta_read) {.     
3890: 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28 64 61             Ok(da
38a0: 74 61 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  ta) => {.       
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
38c0: 6e 74 6c 6e 21 28 22 43 6f 6e 74 65 6e 74 20 52  ntln!("Content R
38d0: 65 61 64 3a 20 22 29 3b 0a 20 20 20 20 20 20 20  ead: ");.       
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
38f0: 6e 74 6c 6e 21 28 22 7b 7d 5c 6e 22 2c 20 64 61  ntln!("{}\n", da
3900: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ta);.           
3910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3920: 20 20 20 20 20 20 20 45 72 72 28 6d 73 67 29 20         Err(msg) 
3930: 3d 3e 20 70 72 69 6e 74 6c 6e 21 28 22 46 61 69  => println!("Fai
3940: 6c 65 64 3a 20 7b 3a 3f 7d 22 2c 20 6d 73 67 29  led: {:?}", msg)
3950: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ,.            }.
3960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3970: 20 20 31 30 20 3d 3e 20 7b 0a 20 20 20 20 20 20    10 => {.      
3980: 20 20 20 20 20 20 2f 2f 20 44 65 6c 65 74 65 20        // Delete 
3990: 66 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20  file.           
39a0: 20 6c 65 74 20 6d 75 74 20 63 68 69 6c 64 20 3d   let mut child =
39b0: 20 74 72 79 21 28 67 65 74 5f 63 68 69 6c 64 5f   try!(get_child_
39c0: 64 69 72 65 63 74 6f 72 79 28 63 6c 69 65 6e 74  directory(client
39d0: 2e 63 6c 6f 6e 65 28 29 2c 20 64 69 72 65 63 74  .clone(), direct
39e0: 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ory));.         
39f0: 20 20 20 6c 65 74 20 66 69 6c 65 5f 68 65 6c 70     let file_help
3a00: 65 72 20 3d 20 46 69 6c 65 48 65 6c 70 65 72 3a  er = FileHelper:
3a10: 3a 6e 65 77 28 63 6c 69 65 6e 74 29 3b 0a 20 20  :new(client);.  
3a20: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f 20            let _ 
3a30: 3d 20 74 72 79 21 28 66 69 6c 65 5f 68 65 6c 70  = try!(file_help
3a40: 65 72 2e 64 65 6c 65 74 65 28 67 65 74 5f 75 73  er.delete(get_us
3a50: 65 72 5f 73 74 72 69 6e 67 28 22 46 69 6c 65 20  er_string("File 
3a60: 6e 61 6d 65 22 29 2c 20 26 6d 75 74 20 63 68 69  name"), &mut chi
3a70: 6c 64 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ld));.          
3a80: 20 20 70 72 69 6e 74 6c 6e 21 28 22 46 69 6c 65    println!("File
3a90: 20 64 65 6c 65 74 65 64 22 29 3b 0a 20 20 20 20   deleted");.    
3aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 31 31      }.        11
3ab0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
3ac0: 20 20 2f 2f 20 43 6f 70 79 20 66 69 6c 65 0a 20    // Copy file. 
3ad0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 66             let f
3ae0: 72 6f 6d 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  rom_directory = 
3af0: 74 72 79 21 28 67 65 74 5f 63 68 69 6c 64 5f 64  try!(get_child_d
3b00: 69 72 65 63 74 6f 72 79 28 63 6c 69 65 6e 74 2e  irectory(client.
3b10: 63 6c 6f 6e 65 28 29 2c 20 64 69 72 65 63 74 6f  clone(), directo
3b20: 72 79 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry));.          
3b30: 20 20 6c 65 74 20 74 6f 5f 64 69 72 5f 6e 61 6d    let to_dir_nam
3b40: 65 20 3d 20 67 65 74 5f 75 73 65 72 5f 73 74 72  e = get_user_str
3b50: 69 6e 67 28 22 53 65 6c 65 63 74 20 74 68 65 20  ing("Select the 
3b60: 44 69 72 65 63 74 6f 72 79 20 74 6f 20 63 6f 70  Directory to cop
3b70: 79 20 66 69 6c 65 20 74 6f 20 28 44 65 73 74 69  y file to (Desti
3b80: 6e 61 74 69 6f 6e 20 5c 0a 20 20 20 20 20 20 20  nation \.       
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 20 20 44 69 72 65 63 74 6f 72          Director
3bc0: 79 29 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  y)");.          
3bd0: 20 20 6c 65 74 20 64 69 72 65 63 74 6f 72 79 5f    let directory_
3be0: 6d 65 74 61 64 61 74 61 20 3d 20 64 69 72 65 63  metadata = direc
3bf0: 74 6f 72 79 2e 67 65 74 5f 73 75 62 5f 64 69 72  tory.get_sub_dir
3c00: 65 63 74 6f 72 69 65 73 28 29 3b 0a 0a 20 20 20  ectories();..   
3c10: 20 20 20 20 20 20 20 20 20 69 66 20 64 69 72 65           if dire
3c20: 63 74 6f 72 79 5f 6d 65 74 61 64 61 74 61 2e 69  ctory_metadata.i
3c30: 73 5f 65 6d 70 74 79 28 29 20 7c 7c 20 64 69 72  s_empty() || dir
3c40: 65 63 74 6f 72 79 5f 6d 65 74 61 64 61 74 61 2e  ectory_metadata.
3c50: 6c 65 6e 28 29 20 3d 3d 20 31 20 7b 0a 20 20 20  len() == 1 {.   
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
3c70: 6e 74 6c 6e 21 28 22 4e 6f 20 64 69 72 65 63 74  ntln!("No direct
3c80: 6f 72 69 65 73 20 66 6f 75 6e 64 22 29 3b 0a 20  ories found");. 
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
3ca0: 65 74 75 72 6e 20 4f 6b 28 28 29 29 3b 0a 20 20  eturn Ok(());.  
3cb0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
3cc0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3cd0: 20 20 20 6d 61 74 63 68 20 64 69 72 65 63 74 6f     match directo
3ce0: 72 79 5f 6d 65 74 61 64 61 74 61 2e 69 74 65 72  ry_metadata.iter
3cf0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ().             
3d00: 20 20 20 20 20 20 20 2e 66 69 6e 64 28 7c 6d 65         .find(|me
3d10: 74 61 64 61 74 61 7c 20 2a 6d 65 74 61 64 61 74  tadata| *metadat
3d20: 61 2e 67 65 74 5f 6e 61 6d 65 28 29 20 3d 3d 20  a.get_name() == 
3d30: 74 6f 5f 64 69 72 5f 6e 61 6d 65 29 20 7b 0a 20  to_dir_name) {. 
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d50: 20 20 20 53 6f 6d 65 28 74 6f 5f 64 69 72 29 20     Some(to_dir) 
3d60: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3d80: 66 72 6f 6d 5f 64 69 72 65 63 74 6f 72 79 2e 67  from_directory.g
3d90: 65 74 5f 6b 65 79 28 29 20 3d 3d 20 74 6f 5f 64  et_key() == to_d
3da0: 69 72 2e 67 65 74 5f 6b 65 79 28 29 20 7b 0a 20  ir.get_key() {. 
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3dd0: 6e 20 45 72 72 28 4e 66 73 45 72 72 6f 72 3a 3a  n Err(NfsError::
3de0: 44 65 73 74 69 6e 61 74 69 6f 6e 41 6e 64 53 6f  DestinationAndSo
3df0: 75 72 63 65 41 72 65 53 61 6d 65 29 3b 0a 20 20  urceAreSame);.  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 6c 65 74 20 66 69 6c 65 5f 6e 61 6d 65 20 3d 20  let file_name = 
3e40: 26 67 65 74 5f 75 73 65 72 5f 73 74 72 69 6e 67  &get_user_string
3e50: 28 22 46 69 6c 65 20 6e 61 6d 65 22 29 3b 0a 20  ("File name");. 
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 20 20 20 20 20 20 6c 65 74 20 66 69 6c 65 20         let file 
3e80: 3d 20 74 72 79 21 28 66 72 6f 6d 5f 64 69 72 65  = try!(from_dire
3e90: 63 74 6f 72 79 2e 66 69 6e 64 5f 66 69 6c 65 28  ctory.find_file(
3ea0: 66 69 6c 65 5f 6e 61 6d 65 29 0a 20 20 20 20 20  file_name).     
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 20 20 20 2e 6f 6b 5f 6f 72 28 4e 66         .ok_or(Nf
3ed0: 73 45 72 72 6f 72 3a 3a 46 69 6c 65 4e 6f 74 46  sError::FileNotF
3ee0: 6f 75 6e 64 29 29 3b 0a 20 20 20 20 20 20 20 20  ound));.        
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 6c 65 74 20 64 69 72 65 63 74 6f 72 79 5f 68 65  let directory_he
3f10: 6c 70 65 72 20 3d 20 44 69 72 65 63 74 6f 72 79  lper = Directory
3f20: 48 65 6c 70 65 72 3a 3a 6e 65 77 28 63 6c 69 65  Helper::new(clie
3f30: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
3f50: 20 6d 75 74 20 64 65 73 74 69 6e 61 74 69 6f 6e   mut destination
3f60: 20 3d 20 74 72 79 21 28 64 69 72 65 63 74 6f 72   = try!(director
3f70: 79 5f 68 65 6c 70 65 72 2e 67 65 74 28 74 6f 5f  y_helper.get(to_
3f80: 64 69 72 2e 67 65 74 5f 6b 65 79 28 29 29 29 3b  dir.get_key()));
3f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3fa0: 20 20 20 20 20 20 20 20 20 69 66 20 64 65 73 74           if dest
3fb0: 69 6e 61 74 69 6f 6e 2e 66 69 6e 64 5f 66 69 6c  ination.find_fil
3fc0: 65 28 66 69 6c 65 5f 6e 61 6d 65 29 2e 69 73 5f  e(file_name).is_
3fd0: 73 6f 6d 65 28 29 20 7b 0a 20 20 20 20 20 20 20  some() {.       
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 72 65 74 75 72 6e 20 45 72 72 28       return Err(
4000: 4e 66 73 45 72 72 6f 72 3a 3a 46 69 6c 65 41 6c  NfsError::FileAl
4010: 72 65 61 64 79 45 78 69 73 74 73 57 69 74 68 53  readyExistsWithS
4020: 61 6d 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ameName);.      
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4050: 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 74              dest
4060: 69 6e 61 74 69 6f 6e 2e 67 65 74 5f 6d 75 74 5f  ination.get_mut_
4070: 66 69 6c 65 73 28 29 2e 70 75 73 68 28 66 69 6c  files().push(fil
4080: 65 2e 63 6c 6f 6e 65 28 29 29 3b 0a 20 20 20 20  e.clone());.    
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40a0: 20 20 20 20 6c 65 74 20 5f 20 3d 20 74 72 79 21      let _ = try!
40b0: 28 64 69 72 65 63 74 6f 72 79 5f 68 65 6c 70 65  (directory_helpe
40c0: 72 2e 75 70 64 61 74 65 28 26 64 65 73 74 69 6e  r.update(&destin
40d0: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20  ation));.       
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 70 72 69 6e 74 6c 6e 21 28 22 46 69 6c 65 20   println!("File 
4100: 63 6f 70 69 65 64 22 29 3b 0a 20 20 20 20 20 20  copied");.      
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 70 72 69 6e      None => prin
4140: 74 6c 6e 21 28 22 44 65 73 74 69 6e 61 74 69 6f  tln!("Destinatio
4150: 6e 20 44 69 72 65 63 74 6f 72 79 20 6e 6f 74 20  n Directory not 
4160: 66 6f 75 6e 64 22 29 2c 0a 20 20 20 20 20 20 20  found"),.       
4170: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4190: 20 7d 0a 20 20 20 20 20 20 20 20 5f 20 3d 3e 20   }.        _ => 
41a0: 7b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4f 6b 28  {}.    }.    Ok(
41b0: 28 29 29 0a 7d 0a 0a 66 6e 20 6d 61 69 6e 28 29  ()).}..fn main()
41c0: 20 7b 0a 20 20 20 20 6c 65 74 20 74 65 73 74 5f   {.    let test_
41d0: 63 6c 69 65 6e 74 20 3d 20 75 6e 77 72 61 70 21  client = unwrap!
41e0: 28 63 72 65 61 74 65 5f 61 63 63 6f 75 6e 74 28  (create_account(
41f0: 29 29 3b 0a 20 20 20 20 6c 65 74 20 63 6c 69 65  ));.    let clie
4200: 6e 74 20 3d 20 41 72 63 3a 3a 6e 65 77 28 4d 75  nt = Arc::new(Mu
4210: 74 65 78 3a 3a 6e 65 77 28 74 65 73 74 5f 63 6c  tex::new(test_cl
4220: 69 65 6e 74 29 29 3b 0a 20 20 20 20 70 72 69 6e  ient));.    prin
4230: 74 6c 6e 21 28 22 5c 6e 5c 74 2d 2d 20 50 72 65  tln!("\n\t-- Pre
4240: 70 61 72 69 6e 67 20 73 74 6f 72 61 67 65 20 2d  paring storage -
4250: 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 74  ---\n");.    let
4260: 20 6d 75 74 20 72 6f 6f 74 5f 64 69 72 65 63 74   mut root_direct
4270: 6f 72 79 20 3d 20 75 6e 77 72 61 70 21 28 67 65  ory = unwrap!(ge
4280: 74 5f 72 6f 6f 74 5f 64 69 72 65 63 74 6f 72 79  t_root_directory
4290: 28 63 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 29  (client.clone())
42a0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 6c 6e 21 28  );.    println!(
42b0: 22 5c 6e 5c 6e 2d 2d 2d 2d 2d 2d 20 20 28 54 69  "\n\n------  (Ti
42c0: 70 29 20 53 74 61 72 74 20 62 79 20 63 72 65 61  p) Start by crea
42d0: 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ting a directory
42e0: 20 61 6e 64 20 74 68 65 6e 20 73 74 6f 72 65 20   and then store 
42f0: 66 69 6c 65 2c 20 6d 6f 64 69 66 79 20 66 69 6c  file, modify fil
4300: 65 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e \.            
4310: 20 20 77 69 74 68 69 6e 20 74 68 65 20 64 69 72    within the dir
4320: 65 63 74 6f 72 79 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ectory ---------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 29 3b 0a 20  -----------");. 
4340: 20 20 20 6c 6f 6f 70 20 7b 0a 20 20 20 20 20 20     loop {.      
4350: 20 20 6c 65 74 20 6d 75 74 20 6f 70 74 69 6f 6e    let mut option
4360: 20 3d 20 53 74 72 69 6e 67 3a 3a 6e 65 77 28 29   = String::new()
4370: 3b 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ;.        {.    
4380: 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e 21          println!
4390: 28 22 5c 6e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 43 68  ("\n----------Ch
43a0: 6f 6f 73 65 20 61 6e 20 4f 70 65 72 61 74 69 6f  oose an Operatio
43b0: 6e 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n---------------
43c0: 2d 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -");.           
43d0: 20 70 72 69 6e 74 6c 6e 21 28 22 31 2e 20 43 72   println!("1. Cr
43e0: 65 61 74 65 20 44 69 72 65 63 74 6f 72 79 22 29  eate Directory")
43f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
4400: 69 6e 74 6c 6e 21 28 22 32 2e 20 4c 69 73 74 20  intln!("2. List 
4410: 44 69 72 65 63 74 6f 72 69 65 73 22 29 3b 0a 20  Directories");. 
4420: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
4430: 6c 6e 21 28 22 33 2e 20 4c 69 73 74 20 44 69 72  ln!("3. List Dir
4440: 65 63 74 6f 72 79 20 56 65 72 73 69 6f 6e 73 22  ectory Versions"
4450: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4460: 72 69 6e 74 6c 6e 21 28 22 34 2e 20 44 65 6c 65  rintln!("4. Dele
4470: 74 65 20 44 69 72 65 63 74 6f 72 79 22 29 3b 0a  te Directory");.
4480: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4490: 74 6c 6e 21 28 22 35 2e 20 4c 69 73 74 20 46 69  tln!("5. List Fi
44a0: 6c 65 73 20 66 72 6f 6d 20 64 69 72 65 63 74 6f  les from directo
44b0: 72 79 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ry");.          
44c0: 20 20 70 72 69 6e 74 6c 6e 21 28 22 36 2e 20 43    println!("6. C
44d0: 72 65 61 74 65 20 46 69 6c 65 22 29 3b 0a 20 20  reate File");.  
44e0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c            printl
44f0: 6e 21 28 22 37 2e 20 55 70 64 61 74 65 20 46 69  n!("7. Update Fi
4500: 6c 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le");.          
4510: 20 20 70 72 69 6e 74 6c 6e 21 28 22 38 2e 20 47    println!("8. G
4520: 65 74 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 22  et file content"
4530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4540: 72 69 6e 74 6c 6e 21 28 22 39 2e 20 47 65 74 20  rintln!("9. Get 
4550: 66 69 6c 65 20 63 6f 6e 74 65 6e 74 20 62 79 20  file content by 
4560: 76 65 72 73 69 6f 6e 22 29 3b 0a 20 20 20 20 20  version");.     
4570: 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e 21 28         println!(
4580: 22 31 30 2e 20 44 65 6c 65 74 65 20 66 69 6c 65  "10. Delete file
4590: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
45a0: 70 72 69 6e 74 6c 6e 21 28 22 31 31 2e 20 43 6f  println!("11. Co
45b0: 70 79 20 66 69 6c 65 22 29 3b 0a 20 20 20 20 20  py file");.     
45c0: 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e 21 28         println!(
45d0: 22 31 32 2e 20 45 78 69 74 22 29 3b 0a 20 20 20  "12. Exit");.   
45e0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c 6e           println
45f0: 21 28 22 2d 2d 2d 2d 2d 2d 20 45 6e 74 65 72 20  !("------ Enter 
4600: 61 20 6e 75 6d 62 65 72 20 2d 2d 2d 2d 2d 2d 2d  a number -------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 29 3b  -------------");
4620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74  .            let
4630: 20 5f 20 3d 20 73 74 64 3a 3a 69 6f 3a 3a 73 74   _ = std::io::st
4640: 64 69 6e 28 29 2e 72 65 61 64 5f 6c 69 6e 65 28  din().read_line(
4650: 26 6d 75 74 20 6f 70 74 69 6f 6e 29 3b 0a 20 20  &mut option);.  
4660: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 6c            printl
4670: 6e 21 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  n!("\n");.      
4680: 20 20 20 20 20 20 6d 61 74 63 68 20 6f 70 74 69        match opti
4690: 6f 6e 2e 74 72 69 6d 28 29 2e 70 61 72 73 65 3a  on.trim().parse:
46a0: 3a 3c 75 33 32 3e 28 29 20 7b 0a 20 20 20 20 20  :<u32>() {.     
46b0: 20 20 20 20 20 20 20 20 20 20 20 4f 6b 28 73 65             Ok(se
46c0: 6c 65 63 74 69 6f 6e 29 20 3d 3e 20 7b 0a 20 20  lection) => {.  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 6d 61 74 63 68 20 73 65 6c 65 63 74 69 6f    match selectio
46f0: 6e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n {.            
4700: 20 20 20 20 20 20 20 20 20 20 20 20 31 2e 2e 2e              1...
4710: 34 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  4 => {.         
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 69 66 20 6c 65 74 20 45 72 72 28 6d 73     if let Err(ms
4740: 67 29 20 3d 20 64 69 72 65 63 74 6f 72 79 5f 6f  g) = directory_o
4750: 70 65 72 61 74 69 6f 6e 28 73 65 6c 65 63 74 69  peration(selecti
4760: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 20 20 63 6c 69 65 6e 74 2e 63 6c 6f        client.clo
47b0: 6e 65 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ne(),.          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 20 20 20 26 6d 75 74 20 72 6f 6f          &mut roo
4800: 74 5f 64 69 72 65 63 74 6f 72 79 29 20 7b 0a 20  t_directory) {. 
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4830: 72 69 6e 74 6c 6e 21 28 22 46 61 69 6c 65 64 3a  rintln!("Failed:
4840: 20 7b 3a 3f 7d 22 2c 20 6d 73 67 29 3b 0a 20 20   {:?}", msg);.  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 2e                5.
48a0: 2e 2e 31 31 20 3d 3e 20 7b 0a 20 20 20 20 20 20  ..11 => {.      
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 69 66 20 6c 65 74 20 45 72 72        if let Err
48d0: 28 6d 73 67 29 20 3d 20 66 69 6c 65 5f 6f 70 65  (msg) = file_ope
48e0: 72 61 74 69 6f 6e 28 73 65 6c 65 63 74 69 6f 6e  ration(selection
48f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4930: 6c 69 65 6e 74 2e 63 6c 6f 6e 65 28 29 2c 0a 20  lient.clone(),. 
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 75 74              &mut
4980: 20 72 6f 6f 74 5f 64 69 72 65 63 74 6f 72 79 29   root_directory)
4990: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 20 20 20 70 72 69 6e 74 6c 6e 21 28 22 46 61 69     println!("Fai
49c0: 6c 65 64 3a 20 7b 3a 3f 7d 22 2c 20 6d 73 67 29  led: {:?}", msg)
49d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 31 32 20 3d 3e 20 62 72 65 61 6b 2c 0a 20    12 => break,. 
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a40: 20 20 20 20 20 20 20 5f 20 3d 3e 20 70 72 69 6e         _ => prin
4a50: 74 6c 6e 21 28 22 49 6e 76 61 6c 69 64 20 6f 70  tln!("Invalid op
4a60: 74 69 6f 6e 22 29 2c 0a 20 20 20 20 20 20 20 20  tion"),.        
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4aa0: 45 72 72 28 5f 29 20 3d 3e 20 70 72 69 6e 74 6c  Err(_) => printl
4ab0: 6e 21 28 22 45 6e 74 65 72 20 61 20 76 61 6c 69  n!("Enter a vali
4ac0: 64 20 6e 75 6d 62 65 72 22 29 2c 0a 20 20 20 20  d number"),.    
4ad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ae0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a                }.    }.}.