1
|
|
|
<?php |
2
|
|
|
namespace Desmond\functions\special; |
3
|
|
|
use Desmond\functions\DesmondSpecialFunction; |
4
|
|
|
use Desmond\exceptions\ArgumentException; |
5
|
|
|
use Desmond\ArgumentHelper; |
6
|
|
|
use Desmond\functions\core\FileContents; |
7
|
|
|
use Desmond\functions\core\Ast; |
8
|
|
|
use Desmond\data_types\StringType; |
9
|
|
|
|
10
|
|
|
class LoadFile extends DesmondSpecialFunction |
11
|
|
|
{ |
12
|
|
|
use ArgumentHelper; |
13
|
|
|
|
14
|
|
|
private $file; |
15
|
|
|
private $oldFilePath; |
16
|
|
|
private $oldDir; |
17
|
|
|
|
18
|
7 |
|
public function run(array $args) |
19
|
|
|
{ |
20
|
7 |
|
if (!isset($args[0])) { |
21
|
1 |
|
throw new ArgumentException('"load-file" expects argument 1 to be one of (Symbol, String)'); |
22
|
|
|
} |
23
|
6 |
|
$this->file = $this->eval->getReturn($args[0]); |
24
|
6 |
|
$this->updatePaths('new'); |
25
|
6 |
|
$return = $this->eval->getReturn($this->getAst()); |
26
|
5 |
|
$this->updatePaths('old'); |
27
|
5 |
|
return $return; |
28
|
|
|
} |
29
|
|
|
|
30
|
6 |
|
private function getAst() |
31
|
|
|
{ |
32
|
6 |
|
$ast = new Ast(); |
33
|
6 |
|
return $ast->run([ |
34
|
6 |
|
new StringType($this->getContents(), true) |
35
|
|
|
]); |
36
|
|
|
} |
37
|
|
|
|
38
|
6 |
|
private function getContents() |
39
|
|
|
{ |
40
|
6 |
|
$fileContents = new FileContents; |
41
|
6 |
|
$contents = $fileContents->run([$this->file]); |
42
|
5 |
|
return sprintf('(do %s)', $contents); |
43
|
|
|
} |
44
|
|
|
|
45
|
6 |
|
private function updatePaths($to) |
46
|
|
|
{ |
47
|
6 |
|
if ($to == 'new') { |
48
|
6 |
|
$this->oldFilePath = $this->currentEnv->exists('_file') |
49
|
1 |
|
? $this->currentEnv->get('_file') |
50
|
6 |
|
: new StringType(''); |
51
|
6 |
|
$this->oldDir = $this->currentEnv->exists('_dir') |
52
|
1 |
|
? $this->currentEnv->get('_dir') |
53
|
6 |
|
: new StringType(''); |
54
|
6 |
|
$this->currentEnv->set('_file', new StringType($this->getFilePath())); |
55
|
6 |
|
$this->currentEnv->set('_dir', new StringType($this->getDir())); |
56
|
|
|
} else { |
57
|
5 |
|
$this->currentEnv->set('_file', $this->oldFilePath); |
58
|
5 |
|
$this->currentEnv->set('_dir', $this->oldDir); |
59
|
|
|
} |
60
|
6 |
|
} |
61
|
|
|
|
62
|
6 |
|
private function getDir() |
63
|
|
|
{ |
64
|
6 |
|
return dirname(realpath($this->file->value())); |
65
|
|
|
} |
66
|
|
|
|
67
|
6 |
|
private function getFilePath() |
68
|
|
|
{ |
69
|
6 |
|
return realpath($this->file->value()); |
70
|
|
|
} |
71
|
|
|
} |
72
|
|
|
|