Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(rustic-babel-build-sentinel): align behaviour with other lang #535

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

ed9w2in6
Copy link

In an org file, the src block's code should be interpreted, OR the binary compiled from it SHOULD execute with PWD as default-directory of the org file.

Summary of changes:

  1. save the original default-directory then later restores it.
  2. supply --manifest-path option to cargo run to execute the target Cargo.toml binary compiled from the src block.

For reference:
Try to execute a C++, C, js (node), python block.
In particular, see implementation of org-babel-C-execute or org-babel-python-evaluate-external-process.
May be we can re-write like them in the future.

fixes: #509

In an org file, the src block's code should be interpreted, OR the binary compiled from it SHOULD execute with PWD as `default-directory` of the org file.

Summary of changes: 
1. save the original default-directory then later restores it.
2. supply `--manifest-path` option to `cargo run` to execute the target `Cargo.toml` binary compiled from the src block.

For reference:
Try to execute a C++, C, js (node), python block.
In particular, see implementation of `org-babel-C-execute` or `org-babel-python-evaluate-external-process`.  May be we can re-write like them in the future.

fixes: brotzeit#509
@ed9w2in6
Copy link
Author

The 2 code block should yield identical outputs when executed in a src block of a org file.

Rust

use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    for f in fs::read_dir(".")? {
        let fpath = f?.path();
        let fname = fpath.to_str().expect("Path should convert to str");
        println!("{fname}");
    }
    Ok(())
}

C++

#include <string.h>
#include <dirent.h>
#include <stdio.h>

using namespace std;

int main() {
DIR *dir;
struct dirent *dp;

dir = opendir(".");
while ((dp = readdir(dir)) != NULL) {
  // printf("debug: %s\n", dp->d_name);
  if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") ) {
    // do nothing (straight logic)
  } else {
    printf("./%s\n", dp->d_name);
  }
}
closedir(dir);
return 0;
return 0;
}

Here is a sample org file for your reference.

Sample Org File
#+TITLE:Loop Do Nothing
* Components
** foobar
   #+begin_src rustic :results output scalar :eval yes :main no
use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    for f in fs::read_dir(".")? {
        let fpath = f?.path();
        let fname = fpath.to_str().expect("Path should convert to str");
        println!("{fname}");
    }
    Ok(())
}
   #+end_src

#+begin_src C++ :results scalar :eval yes :includes <string.h> <dirent.h> <stdio.h> :namespaces std
DIR *dir;
struct dirent *dp;

dir = opendir(".");
while ((dp = readdir(dir)) != NULL) {
  // printf("debug: %s\n", dp->d_name);
  if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") ) {
    // do nothing (straight logic)
  } else {
    printf("./%s\n", dp->d_name);
  }
}
closedir(dir);
return 0;
#+end_src

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Directory that binary executed from
1 participant