#json #json-parser #astronomy #ivoa #stc

stc-s

Rust实现支持JSON的STC-S序列化/反序列化器

1个不稳定版本

0.1.0 2023年12月12日

#984编码

Download history 13/week @ 2024-05-14 82/week @ 2024-05-21 1843/week @ 2024-05-28 60/week @ 2024-06-04 25/week @ 2024-06-11 76/week @ 2024-06-18 154/week @ 2024-06-25 236/week @ 2024-07-02 92/week @ 2024-07-09 153/week @ 2024-07-16 122/week @ 2024-07-23 12/week @ 2024-07-30

每月463次下载
moc 中使用

Apache-2.0 OR MIT

230KB
7.5K SLoC

stc-sSTCSLibRust

用于在Rust中读取/写入IVOASTC-S字符串的库,并将它们从/到JSON进行转换。解析器是根据

其他现有实现

动机

此库用于MOC库Rust,以支持从(简单)STC-S描述创建MOCs -- S-MOCs、ST-MOCs、F-MOCs等。例如,这个特性已在MOCPy中提出,请参阅问题#111

它也可以用于

状态

此库处于早期开发阶段。我们对(合理的)更改持开放态度,并感谢反馈。请提供更多STC-S示例!

API示例中的STC-S字符串

Stc::new().set_space(
  PositionInterval::from_frame(Frame::ICRS)
    .set_refpos(SpaceTimeRefPos::Geocenter)
    .set_lo_hi_limits(vec![170.0, -20.0, 190.0, 10.0])
    .set_resolution(vec![0.0001])
).to_string();

提供字符串

"PositionInterval ICRS GEOCENTER 170 -20 190 10 Resolution 0.0001"

您可以使用以下方法将字符串解析回对象(请避免使用unwrap,有关完整示例,请参阅lib.rs中的测试)

let ascii = "PositionInterval ICRS GEOCENTER 170 -20 190 10 Resolution 0.0001";
let stc = Stc::parse::<VerboseError<&str>>(ascii).unwrap().1;

STC-S到JSON转换示例

以下示例是从内部测试中提取的。

示例1

Circle ICRS TOPOCENTER 147.6 69.9 0.4

转换为

{
  "space": {
    "Circle": {
      "frame": "ICRS",
      "refpos": "TOPOCENTER",
      "pos": [
        147.6,
        69.9
      ],
      "radius": 0.4
    }
  }
}

示例2

Time TDB BARYCENTER MJD 50814.0 
Position ICRS BARYCENTER 147.3 69.3

转换为

{
  "time": {
    "Time": {
      "timescale": "TDB",
      "refpos": "BARYCENTER",
      "time": {
        "MJD": "50814.0"
      }
    }
  },
  "space": {
    "frame": "ICRS",
    "refpos": "BARYCENTER",
    "pos": [
      147.3,
      69.3
    ]
  }
}

示例3

TimeInterval TT GEOCENTER 1996-01-01T00:00:00 1996-01-01T00:30:00
 Time MJD 50814.0 Error 1.2 Resolution 0.8 PixSize 1024.0
Circle ICRS GEOCENTER 179.0 -11.5 0.5 Position 179.0 -11.5
 Error 0.000889 Resolution 0.001778 Size 0.000333 0.000278
 PixSize 0.000083 0.000083
Spectral BARYCENTER 1420.4 unit MHz Resolution 10.0
RedshiftInterval BARYCENTER VELOCITY OPTICAL 200.0 2300.0
 Redshift 300.0 Resolution 0.7 PixSize 0.3

转换为

{
  "time": {
    "TimeInterval": {
      "timescale": "TT",
      "refpos": "GEOCENTER",
      "start": [
        {
          "Iso": "1996-01-01T00:00:00Z"
        }
      ],
      "stop": [
        {
          "Iso": "1996-01-01T00:30:00Z"
        }
      ],
      "time": {
        "MJD": "50814.0"
      },
      "error": 1.2,
      "resolution": 0.8,
      "pixsize": 1024.0
    }
  },
  "space": {
    "Circle": {
      "frame": "ICRS",
      "refpos": "GEOCENTER",
      "pos": [
        179.0,
        -11.5
      ],
      "radius": 0.5,
      "position": [
        179.0,
        -11.5
      ],
      "error": [
        0.000889
      ],
      "resolution": [
        0.001778
      ],
      "size": [
        0.000333,
        0.000278
      ],
      "pixsize": [
        0.000083,
        0.000083
      ]
    }
  },
  "spectral": {
    "Value": {
      "refpos": "BARYCENTER",
      "value": 1420.4,
      "unit": "MHz",
      "resolution": 10.0
    }
  },
  "redshift": {
    "RedshiftInterval": {
      "refpos": "BARYCENTER",
      "type": "VELOCITY",
      "dopplerdef": "OPTICAL",
      "lolimit": [
        200.0
      ],
      "hilimit": [
        2300.0
      ],
      "redshift": 300.0,
      "resolution": 0.7,
      "pixsize": 0.3
    }
  }
}

示例4

Union ICRS TOPOCENTER
(Circle 180 10 20
Circle 190 20 20
Intersection
 (Circle 120 -10 20
  Difference
   (Circle 130 -10 20
    Circle 125 -10 2
   )
  Not
   (Circle 118 -8 3)
 )
)

转换为

{
  "space": {
    "Union": {
      "frame": "ICRS",
      "refpos": "TOPOCENTER",
      "elems": [
        {
          "Circle": {
            "pos": [
              180.0,
              10.0
            ],
            "radius": 20.0
          }
        },
        {
          "Circle": {
            "pos": [
              190.0,
              20.0
            ],
            "radius": 20.0
          }
        },
        {
          "Intersection": {
            "elems": [
              {
                "Circle": {
                  "pos": [
                    120.0,
                    -10.0
                  ],
                  "radius": 20.0
                }
              },
              {
                "Difference": {
                  "left": {
                    "Circle": {
                      "pos": [
                        130.0,
                        -10.0
                      ],
                      "radius": 20.0
                    }
                  },
                  "right": {
                    "Circle": {
                      "pos": [
                        125.0,
                        -10.0
                      ],
                      "radius": 2.0
                    }
                  }
                }
              },
              {
                "Not": {
                  "Circle": {
                    "pos": [
                      118.0,
                      -8.0
                    ],
                    "radius": 3.0
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

待办事项列表

  • 解析和写入STC-S。
  • 支持JSON序列化和反序列化。
  • 支持解析TAP中定义的STC-S。
  • 制作CLI。
  • 创建一个JS/Wasm库。
  • 在所有地方添加构建器、获取器和设置器,就像在FillFrameRefposFlavor结构中一样,以创建一个干净的API。
  • 创建一个访问者。
    • 实现一个empty访问者
    • 实现一个echo访问者
    • 实现一个stcs2moc访问者(可在MOCLibRust中找到)
  • 实现fold以避免过宽的行。
  • 支持STC XML序列化/反序列化吗?

许可证

像大多数Rust项目一样,此项目根据您的选择使用以下任一许可证

任选其一。

贡献

除非您明确声明,否则您提交给本项目以供包含在内的任何贡献,根据Apache-2.0许可证的定义,应如上所述双重许可,不附加任何额外条款或条件。

依赖关系

~1.4–2.4MB
~50K SLoC